)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add gre tunneling support for the ML2 plugin"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch add the type_driver GRE to enable teh creation of GRE"},{"line_number":10,"context_line":"tunnels with the OVS agent"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I1a33a4bd3ebc4c97eecf17a59ce16b8c2066ec66"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAPn%2F%2F6UM%3D","line":9,"updated":"2013-06-18 13:53:27.000000000","message":"teh \u003d\u003e the","commit_id":"c52658d44fa5ca044edea8011887f52e977a7d2c"}],"neutron/db/migration/alembic_migrations/versions/20ae61555e95_db_migration_for_ml2.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    under the License."},{"line_number":16,"context_line":"#"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"\"\"\"DB Migration for ML2 GRE Type Driver"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Revision ID: 20ae61555e95"},{"line_number":21,"context_line":"Revises: b7a8863760e"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAP3%2F%2Fqqw%3D","line":18,"updated":"2013-07-14 20:27:43.000000000","message":"The migration script takes only the first first few letters of this description, so with your VXLAN type we will end up with two migration files that end with *_db_migration_for_ml2.py. I know it\u0027s a nit, but it would be nice to fix and I think it\u0027s easy.\n\nThe \"DB Migration for\" is rather redundant given where this file is located. I think you can just rename this file, keeping the magic code before the first _:  20ae61555e95_ml2_gre_type_driver.py","commit_id":"d2b009229becd8fa0066c7cef47032dbae261c35"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    under the License."},{"line_number":16,"context_line":"#"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"\"\"\"DB Migration for ML2 GRE Type Driver"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Revision ID: 20ae61555e95"},{"line_number":21,"context_line":"Revises: b7a8863760e"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAP3%2F%2FqbY%3D","line":18,"in_reply_to":"AAAAP3%2F%2Fqqw%3D","updated":"2013-07-15 01:59:06.000000000","message":"Done","commit_id":"d2b009229becd8fa0066c7cef47032dbae261c35"}],"neutron/db/migration/alembic_migrations/versions/20ae61555e95_ml2_gre_type_driver.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"\"\"DB Migration for ML2 GRE Type Driver"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Revision ID: 20ae61555e95"},{"line_number":21,"context_line":"Revises: b7a8863760e"},{"line_number":22,"context_line":"Create Date: 2013-07-10 17:19:03.021937"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAP3%2F%2FkYI%3D","line":21,"updated":"2013-07-16 13:44:16.000000000","message":"this needs to be updated to the current head.\n Use \u0027bin/quantum-db-manage --config-file\u003detc/neutron.conf history\u0027 to find out current head","commit_id":"8ff7e7dce8120506918aaead7507253784baaa7d"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"\"\"DB Migration for ML2 GRE Type Driver"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Revision ID: 20ae61555e95"},{"line_number":21,"context_line":"Revises: b7a8863760e"},{"line_number":22,"context_line":"Create Date: 2013-07-10 17:19:03.021937"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAP3%2F%2FkNI%3D","line":21,"in_reply_to":"AAAAP3%2F%2FkYI%3D","updated":"2013-07-16 14:15:12.000000000","message":"Done","commit_id":"8ff7e7dce8120506918aaead7507253784baaa7d"}],"neutron/plugins/ml2/drivers/type_gre.py":[{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self._sync_gre_allocations()"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def validate_provider_segment(self, segment):"},{"line_number":80,"context_line":"        physical_network \u003d segment.get(api.PHYSICAL_NETWORK)"},{"line_number":81,"context_line":"        if physical_network:"},{"line_number":82,"context_line":"            msg \u003d _(\"provider:physical_network specified for GRE \""},{"line_number":83,"context_line":"                    \"network\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2F6oQ%3D","line":80,"updated":"2013-07-09 09:19:06.000000000","message":"why need to validate the physical_network ?\nIn my impression, I think only flat and vlan need physical_network, gre seems don\u0027t need this parameter. am i wrong ?","commit_id":"d85ba88240e36bf2b012604a38d0752fa45bec9b"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self._sync_gre_allocations()"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def validate_provider_segment(self, segment):"},{"line_number":80,"context_line":"        physical_network \u003d segment.get(api.PHYSICAL_NETWORK)"},{"line_number":81,"context_line":"        if physical_network:"},{"line_number":82,"context_line":"            msg \u003d _(\"provider:physical_network specified for GRE \""},{"line_number":83,"context_line":"                    \"network\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2F0A4%3D","line":80,"in_reply_to":"AAAAP3%2F%2F6Hg%3D","updated":"2013-07-12 10:00:42.000000000","message":"oh, sorry, I misread the if judgement condition.","commit_id":"d85ba88240e36bf2b012604a38d0752fa45bec9b"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"4ea0e7bf2942e9f6adcb3793110786a255a4373f","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self._sync_gre_allocations()"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def validate_provider_segment(self, segment):"},{"line_number":80,"context_line":"        physical_network \u003d segment.get(api.PHYSICAL_NETWORK)"},{"line_number":81,"context_line":"        if physical_network:"},{"line_number":82,"context_line":"            msg \u003d _(\"provider:physical_network specified for GRE \""},{"line_number":83,"context_line":"                    \"network\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2F6Hg%3D","line":80,"in_reply_to":"AAAAP3%2F%2F6oQ%3D","updated":"2013-07-09 12:44:38.000000000","message":"your right, that\u0027s why we check if physical_network is set as a  parameter. If it is, an exception is raised.","commit_id":"d85ba88240e36bf2b012604a38d0752fa45bec9b"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"unresolved":false,"context_lines":[{"line_number":84,"context_line":"            raise exc.InvalidInput(error_message\u003dmsg)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        segmentation_id \u003d segment.get(api.SEGMENTATION_ID)"},{"line_number":87,"context_line":"        if segmentation_id is None:"},{"line_number":88,"context_line":"            msg \u003d _(\"segmentation_id required for GRE provider network\")"},{"line_number":89,"context_line":"            raise exc.InvalidInput(error_message\u003dmsg)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2F6pI%3D","line":87,"updated":"2013-07-09 09:19:06.000000000","message":"if not segmentation","commit_id":"d85ba88240e36bf2b012604a38d0752fa45bec9b"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"4ea0e7bf2942e9f6adcb3793110786a255a4373f","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            raise exc.InvalidInput(error_message\u003dmsg)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        segmentation_id \u003d segment.get(api.SEGMENTATION_ID)"},{"line_number":87,"context_line":"        if segmentation_id is None:"},{"line_number":88,"context_line":"            msg \u003d _(\"segmentation_id required for GRE provider network\")"},{"line_number":89,"context_line":"            raise exc.InvalidInput(error_message\u003dmsg)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2F6GU%3D","line":87,"in_reply_to":"AAAAP3%2F%2F6pI%3D","updated":"2013-07-09 12:44:38.000000000","message":"Done","commit_id":"d85ba88240e36bf2b012604a38d0752fa45bec9b"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"unresolved":false,"context_lines":[{"line_number":94,"context_line":"            try:"},{"line_number":95,"context_line":"                alloc \u003d (session.query(GreAllocation)."},{"line_number":96,"context_line":"                         filter_by(gre_id\u003dsegmentation_id)."},{"line_number":97,"context_line":"                         with_lockmode(\u0027update\u0027)."},{"line_number":98,"context_line":"                         one())"},{"line_number":99,"context_line":"                if alloc.allocated:"},{"line_number":100,"context_line":"                    raise exc.TunnelIdInUse(tunnel_id\u003dsegmentation_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2F6nY%3D","line":97,"updated":"2013-07-09 09:19:06.000000000","message":"some database doesn\u0027t support \u0027for update\u0027 lock operation. like porstgresql, it supports update_nowait, not update.","commit_id":"d85ba88240e36bf2b012604a38d0752fa45bec9b"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"4ea0e7bf2942e9f6adcb3793110786a255a4373f","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            try:"},{"line_number":95,"context_line":"                alloc \u003d (session.query(GreAllocation)."},{"line_number":96,"context_line":"                         filter_by(gre_id\u003dsegmentation_id)."},{"line_number":97,"context_line":"                         with_lockmode(\u0027update\u0027)."},{"line_number":98,"context_line":"                         one())"},{"line_number":99,"context_line":"                if alloc.allocated:"},{"line_number":100,"context_line":"                    raise exc.TunnelIdInUse(tunnel_id\u003dsegmentation_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2F2Tg%3D","line":97,"in_reply_to":"AAAAP3%2F%2F6Gg%3D","updated":"2013-07-10 13:33:33.000000000","message":"Zhang Hua :  with_lockmode(\u0027update\u0027) is used everywhere in neutron, if there is a compatibility issue with postgresql, maybe you should fill a new bug.","commit_id":"d85ba88240e36bf2b012604a38d0752fa45bec9b"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"4ea0e7bf2942e9f6adcb3793110786a255a4373f","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            try:"},{"line_number":95,"context_line":"                alloc \u003d (session.query(GreAllocation)."},{"line_number":96,"context_line":"                         filter_by(gre_id\u003dsegmentation_id)."},{"line_number":97,"context_line":"                         with_lockmode(\u0027update\u0027)."},{"line_number":98,"context_line":"                         one())"},{"line_number":99,"context_line":"                if alloc.allocated:"},{"line_number":100,"context_line":"                    raise exc.TunnelIdInUse(tunnel_id\u003dsegmentation_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2F6Gg%3D","line":97,"in_reply_to":"AAAAP3%2F%2F6nY%3D","updated":"2013-07-09 12:44:38.000000000","message":"This should also be updated in type_vlan and type_vxlan. Are you sure with_lockmode(\u0027update_nowait\u0027) will be compatible with MySQL?\nhttp://docs.sqlalchemy.org/en/rel_0_7/orm/query.html : \u0027update_nowait\u0027 seems to be compatible only with Oracle and postgre.","commit_id":"d85ba88240e36bf2b012604a38d0752fa45bec9b"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"unresolved":false,"context_lines":[{"line_number":152,"context_line":"            entry \u003d entry.strip()"},{"line_number":153,"context_line":"            try:"},{"line_number":154,"context_line":"                tun_min, tun_max \u003d entry.split(\u0027:\u0027)"},{"line_number":155,"context_line":"                self.gre_id_ranges.append((int(tun_min), int(tun_max)))"},{"line_number":156,"context_line":"            except ValueError as ex:"},{"line_number":157,"context_line":"                LOG.error(_(\"Invalid tunnel ID range: \""},{"line_number":158,"context_line":"                            \"\u0027%(range)s\u0027 - %(e)s. Agent terminated!\"),"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2F6mk%3D","line":155,"updated":"2013-07-09 09:19:06.000000000","message":"can also strip here, more robust","commit_id":"d85ba88240e36bf2b012604a38d0752fa45bec9b"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"4ea0e7bf2942e9f6adcb3793110786a255a4373f","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            entry \u003d entry.strip()"},{"line_number":153,"context_line":"            try:"},{"line_number":154,"context_line":"                tun_min, tun_max \u003d entry.split(\u0027:\u0027)"},{"line_number":155,"context_line":"                self.gre_id_ranges.append((int(tun_min), int(tun_max)))"},{"line_number":156,"context_line":"            except ValueError as ex:"},{"line_number":157,"context_line":"                LOG.error(_(\"Invalid tunnel ID range: \""},{"line_number":158,"context_line":"                            \"\u0027%(range)s\u0027 - %(e)s. Agent terminated!\"),"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2F12I%3D","line":155,"in_reply_to":"AAAAP3%2F%2F6mk%3D","updated":"2013-07-10 15:32:22.000000000","message":"Done","commit_id":"d85ba88240e36bf2b012604a38d0752fa45bec9b"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"4ea0e7bf2942e9f6adcb3793110786a255a4373f","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            entry \u003d entry.strip()"},{"line_number":153,"context_line":"            try:"},{"line_number":154,"context_line":"                tun_min, tun_max \u003d entry.split(\u0027:\u0027)"},{"line_number":155,"context_line":"                self.gre_id_ranges.append((int(tun_min), int(tun_max)))"},{"line_number":156,"context_line":"            except ValueError as ex:"},{"line_number":157,"context_line":"                LOG.error(_(\"Invalid tunnel ID range: \""},{"line_number":158,"context_line":"                            \"\u0027%(range)s\u0027 - %(e)s. Agent terminated!\"),"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2F6Go%3D","line":155,"in_reply_to":"AAAAP3%2F%2F6mk%3D","updated":"2013-07-09 12:44:38.000000000","message":"sorry but I don\u0027t understand. What do you want me to strip?","commit_id":"d85ba88240e36bf2b012604a38d0752fa45bec9b"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"568f4e92bf8e4c1f0dea0e730e70cc9ebe977fa1","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                return {api.NETWORK_TYPE: type_tunnel.TYPE_GRE,"},{"line_number":122,"context_line":"                        api.PHYSICAL_NETWORK: None,"},{"line_number":123,"context_line":"                        api.SEGMENTATION_ID: alloc.gre_id}"},{"line_number":124,"context_line":"        raise exc.NoNetworkAvailable()"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def release_segment(self, session, segment):"},{"line_number":127,"context_line":"        gre_id \u003d segment[api.SEGMENTATION_ID]"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2FxDE%3D","line":124,"updated":"2013-07-11 19:49:28.000000000","message":"This should fall off the end (return implicit None) rather than raise an exception so that the ml2 plugin will try the next TypeDriver in tenant_network_types. See VlanTypeDriver.","commit_id":"44888f33f3ab260fdceb86a6fca26ff6dd08e67f"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":121,"context_line":"                return {api.NETWORK_TYPE: type_tunnel.TYPE_GRE,"},{"line_number":122,"context_line":"                        api.PHYSICAL_NETWORK: None,"},{"line_number":123,"context_line":"                        api.SEGMENTATION_ID: alloc.gre_id}"},{"line_number":124,"context_line":"        raise exc.NoNetworkAvailable()"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def release_segment(self, session, segment):"},{"line_number":127,"context_line":"        gre_id \u003d segment[api.SEGMENTATION_ID]"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2Fw14%3D","line":124,"in_reply_to":"AAAAP3%2F%2FxDE%3D","updated":"2013-07-11 20:02:27.000000000","message":"Done","commit_id":"44888f33f3ab260fdceb86a6fca26ff6dd08e67f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":131,"context_line":"                         with_lockmode(\u0027update\u0027)."},{"line_number":132,"context_line":"                         one())"},{"line_number":133,"context_line":"                alloc.allocated \u003d False"},{"line_number":134,"context_line":"                inside \u003d False"},{"line_number":135,"context_line":"                for gre_id_range in self.gre_id_ranges:"},{"line_number":136,"context_line":"                    if (gre_id \u003e\u003d gre_id_range[0]"},{"line_number":137,"context_line":"                        and gre_id \u003c\u003d gre_id_range[1]):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Frcc%3D","line":134,"updated":"2013-07-13 17:34:48.000000000","message":"Replace 134-145 with a \"for: else:\" loop:\n\nfor lo, hi in self.gre_id_ranges:\n    if lo \u003c\u003d gee_id \u003c\u003d hi:\n        LOG.debug(_(\"Releasing gre tunnel %s to pool\"), gre_id)\n        break\nelse:\n    session.delete(alloc)\n    LOG.debug(_(\"Releasing gre tunnel %s outside pool\"), gre_id)","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":131,"context_line":"                         with_lockmode(\u0027update\u0027)."},{"line_number":132,"context_line":"                         one())"},{"line_number":133,"context_line":"                alloc.allocated \u003d False"},{"line_number":134,"context_line":"                inside \u003d False"},{"line_number":135,"context_line":"                for gre_id_range in self.gre_id_ranges:"},{"line_number":136,"context_line":"                    if (gre_id \u003e\u003d gre_id_range[0]"},{"line_number":137,"context_line":"                        and gre_id \u003c\u003d gre_id_range[1]):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrIM%3D","line":134,"in_reply_to":"AAAAP3%2F%2Frcc%3D","updated":"2013-07-14 03:38:03.000000000","message":"Done","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def _parse_gre_id_ranges(self):"},{"line_number":150,"context_line":"        for entry in cfg.CONF.ml2_type_gre.tunnel_id_ranges:"},{"line_number":151,"context_line":"            entry \u003d entry.strip()"},{"line_number":152,"context_line":"            try:"},{"line_number":153,"context_line":"                tun_min, tun_max \u003d entry.split(\u0027:\u0027)"},{"line_number":154,"context_line":"                tun_min \u003d tun_min.strip()"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Frbw%3D","line":151,"updated":"2013-07-13 17:34:48.000000000","message":"Why the double strips()?  Consider replacing 150-156:\n\nself.gre_id_ranges.extend(\n    (int(e.strip()) \n     for e in (entry.split(\u0027:\u0027)[:2] for entry in cfg.CONF.ml2_type_gre.tunnel_id_ranges)\n    )","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def _parse_gre_id_ranges(self):"},{"line_number":150,"context_line":"        for entry in cfg.CONF.ml2_type_gre.tunnel_id_ranges:"},{"line_number":151,"context_line":"            entry \u003d entry.strip()"},{"line_number":152,"context_line":"            try:"},{"line_number":153,"context_line":"                tun_min, tun_max \u003d entry.split(\u0027:\u0027)"},{"line_number":154,"context_line":"                tun_min \u003d tun_min.strip()"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fqv8%3D","line":151,"in_reply_to":"AAAAP3%2F%2Fqx0%3D","updated":"2013-07-14 18:47:59.000000000","message":"Done","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def _parse_gre_id_ranges(self):"},{"line_number":150,"context_line":"        for entry in cfg.CONF.ml2_type_gre.tunnel_id_ranges:"},{"line_number":151,"context_line":"            entry \u003d entry.strip()"},{"line_number":152,"context_line":"            try:"},{"line_number":153,"context_line":"                tun_min, tun_max \u003d entry.split(\u0027:\u0027)"},{"line_number":154,"context_line":"                tun_min \u003d tun_min.strip()"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fqx0%3D","line":151,"in_reply_to":"AAAAP3%2F%2FrIE%3D","updated":"2013-07-14 17:28:57.000000000","message":"This doesn\u0027t actually change the logic.  Just implements more efficiently.","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def _parse_gre_id_ranges(self):"},{"line_number":150,"context_line":"        for entry in cfg.CONF.ml2_type_gre.tunnel_id_ranges:"},{"line_number":151,"context_line":"            entry \u003d entry.strip()"},{"line_number":152,"context_line":"            try:"},{"line_number":153,"context_line":"                tun_min, tun_max \u003d entry.split(\u0027:\u0027)"},{"line_number":154,"context_line":"                tun_min \u003d tun_min.strip()"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrIE%3D","line":151,"in_reply_to":"AAAAP3%2F%2Frbw%3D","updated":"2013-07-14 03:38:03.000000000","message":"I would prefer leaving this as is, since it\u0027s the same way tunnel IDs are passed in the existing OVS plugin.","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":158,"context_line":"                LOG.error(_(\"Invalid tunnel ID range: \""},{"line_number":159,"context_line":"                            \"\u0027%(range)s\u0027 - %(e)s. Agent terminated!\"),"},{"line_number":160,"context_line":"                          {\u0027range\u0027: entry, \u0027e\u0027: ex})"},{"line_number":161,"context_line":"                sys.exit(1)"},{"line_number":162,"context_line":"        LOG.info(_(\"gre ID ranges: %s\"), self.gre_id_ranges)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def _sync_gre_allocations(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Frbs%3D","line":161,"updated":"2013-07-13 17:34:48.000000000","message":"This can potentially break the unit test runner.  Change to \nraise SystemExit(1)","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":158,"context_line":"                LOG.error(_(\"Invalid tunnel ID range: \""},{"line_number":159,"context_line":"                            \"\u0027%(range)s\u0027 - %(e)s. Agent terminated!\"),"},{"line_number":160,"context_line":"                          {\u0027range\u0027: entry, \u0027e\u0027: ex})"},{"line_number":161,"context_line":"                sys.exit(1)"},{"line_number":162,"context_line":"        LOG.info(_(\"gre ID ranges: %s\"), self.gre_id_ranges)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def _sync_gre_allocations(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrIA%3D","line":161,"in_reply_to":"AAAAP3%2F%2Frbs%3D","updated":"2013-07-14 03:38:03.000000000","message":"Done","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def get_gre_allocation(self, session, gre_id):"},{"line_number":200,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":201,"context_line":"            try:"},{"line_number":202,"context_line":"                alloc \u003d (session.query(GreAllocation)."},{"line_number":203,"context_line":"                         filter_by(gre_id\u003dgre_id).one())"},{"line_number":204,"context_line":"                return alloc"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Frbk%3D","line":201,"updated":"2013-07-13 17:34:48.000000000","message":"replace 201-206 with:\n\nreturn session.query(GreAllocation).filter_by(gre_id\u003dgre_id).first()","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def get_gre_allocation(self, session, gre_id):"},{"line_number":200,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":201,"context_line":"            try:"},{"line_number":202,"context_line":"                alloc \u003d (session.query(GreAllocation)."},{"line_number":203,"context_line":"                         filter_by(gre_id\u003dgre_id).one())"},{"line_number":204,"context_line":"                return alloc"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrH8%3D","line":201,"in_reply_to":"AAAAP3%2F%2Frbk%3D","updated":"2013-07-14 03:38:03.000000000","message":"Done","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":215,"context_line":"            gre_endpoints \u003d session.query(GreEndpoints)"},{"line_number":216,"context_line":"            return [{\u0027ip_address\u0027: gre_endpoint.ip_address}"},{"line_number":217,"context_line":"                    for gre_endpoint in gre_endpoints]"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def add_endpoint(self, ip):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Frbg%3D","line":216,"updated":"2013-07-13 17:34:48.000000000","message":"Why is the return value a list of dicts with 1 key.  Why just return a list of ip_addresses?","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":215,"context_line":"            gre_endpoints \u003d session.query(GreEndpoints)"},{"line_number":216,"context_line":"            return [{\u0027ip_address\u0027: gre_endpoint.ip_address}"},{"line_number":217,"context_line":"                    for gre_endpoint in gre_endpoints]"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def add_endpoint(self, ip):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrH4%3D","line":216,"in_reply_to":"AAAAP3%2F%2Frbg%3D","updated":"2013-07-14 03:38:03.000000000","message":"I think this is because the caller (tunnel_sync) has to return the same values since it\u0027s an RPC call, and this is what the agent expects.","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    gre_id \u003d sa.Column(sa.Integer, nullable\u003dFalse, primary_key\u003dTrue,"},{"line_number":45,"context_line":"                       autoincrement\u003dFalse)"},{"line_number":46,"context_line":"    allocated \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def __init__(self, gre_id):"},{"line_number":49,"context_line":"        self.gre_id \u003d gre_id"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2FqyI%3D","line":46,"updated":"2013-07-14 17:30:29.000000000","message":"default\u003dFalse","commit_id":"5b1de6fa72a0bcf62dc15e7e9409c0243a799c2c"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    gre_id \u003d sa.Column(sa.Integer, nullable\u003dFalse, primary_key\u003dTrue,"},{"line_number":45,"context_line":"                       autoincrement\u003dFalse)"},{"line_number":46,"context_line":"    allocated \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def __init__(self, gre_id):"},{"line_number":49,"context_line":"        self.gre_id \u003d gre_id"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2FqwQ%3D","line":46,"in_reply_to":"AAAAP3%2F%2FqyI%3D","updated":"2013-07-14 19:12:41.000000000","message":"Done","commit_id":"5b1de6fa72a0bcf62dc15e7e9409c0243a799c2c"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":45,"context_line":"                       autoincrement\u003dFalse)"},{"line_number":46,"context_line":"    allocated \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def __init__(self, gre_id):"},{"line_number":49,"context_line":"        self.gre_id \u003d gre_id"},{"line_number":50,"context_line":"        self.allocated \u003d False"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2Fqx8%3D","line":48,"updated":"2013-07-14 17:30:29.000000000","message":"I missed this yesterday.  This can be dropped because the defaults should be set via default keyword to the column definition.","commit_id":"5b1de6fa72a0bcf62dc15e7e9409c0243a799c2c"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":45,"context_line":"                       autoincrement\u003dFalse)"},{"line_number":46,"context_line":"    allocated \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def __init__(self, gre_id):"},{"line_number":49,"context_line":"        self.gre_id \u003d gre_id"},{"line_number":50,"context_line":"        self.allocated \u003d False"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2FqwM%3D","line":48,"in_reply_to":"AAAAP3%2F%2Fqx8%3D","updated":"2013-07-14 19:12:41.000000000","message":"Done","commit_id":"5b1de6fa72a0bcf62dc15e7e9409c0243a799c2c"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    ip_address \u003d sa.Column(sa.String(64), primary_key\u003dTrue)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def __init__(self, ip_address):"},{"line_number":60,"context_line":"        self.ip_address \u003d ip_address"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def __repr__(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2FqyE%3D","line":59,"updated":"2013-07-14 17:30:29.000000000","message":"this should be dropped","commit_id":"5b1de6fa72a0bcf62dc15e7e9409c0243a799c2c"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    ip_address \u003d sa.Column(sa.String(64), primary_key\u003dTrue)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def __init__(self, ip_address):"},{"line_number":60,"context_line":"        self.ip_address \u003d ip_address"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def __repr__(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2FqwI%3D","line":59,"in_reply_to":"AAAAP3%2F%2FqyE%3D","updated":"2013-07-14 19:12:41.000000000","message":"Done","commit_id":"5b1de6fa72a0bcf62dc15e7e9409c0243a799c2c"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def __init__(self, ip_address):"},{"line_number":60,"context_line":"        self.ip_address \u003d ip_address"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def __repr__(self):"},{"line_number":63,"context_line":"        return \"\u003cTunnelEndpoint(%s)\u003e\" % (self.ip_address)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2Fqx4%3D","line":62,"updated":"2013-07-14 17:30:29.000000000","message":"the base class provides this method in nearly an identical implementation","commit_id":"5b1de6fa72a0bcf62dc15e7e9409c0243a799c2c"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def __init__(self, ip_address):"},{"line_number":60,"context_line":"        self.ip_address \u003d ip_address"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def __repr__(self):"},{"line_number":63,"context_line":"        return \"\u003cTunnelEndpoint(%s)\u003e\" % (self.ip_address)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2FqwE%3D","line":62,"in_reply_to":"AAAAP3%2F%2Fqx4%3D","updated":"2013-07-14 19:12:41.000000000","message":"It\u0027s not quite identical, I\u0027ll leave it for now unless there are strong objections.","commit_id":"5b1de6fa72a0bcf62dc15e7e9409c0243a799c2c"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"568f4e92bf8e4c1f0dea0e730e70cc9ebe977fa1","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    def _parse_gre_id_ranges(self):"},{"line_number":138,"context_line":"        try:"},{"line_number":139,"context_line":"            self.gre_id_ranges.extend("},{"line_number":140,"context_line":"                (int(e.strip())"},{"line_number":141,"context_line":"                 for e in (entry.split(\u0027:\u0027)[:2] for entry in cfg."},{"line_number":142,"context_line":"                           CONF.ml2_type_gre.tunnel_id_ranges))"},{"line_number":143,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAP3%2F%2FmfI%3D","line":140,"updated":"2013-07-16 00:00:15.000000000","message":"This e.strip() call is failing with:\n\n2013-07-15 22:07:45.342 20588 TRACE neutron   File \"/opt/stack/neutron/neutron/plugins/ml2/drivers/type_gre.py\", line 67, in initialize\n2013-07-15 22:07:45.342 20588 TRACE neutron     self._parse_gre_id_ranges()\n2013-07-15 22:07:45.342 20588 TRACE neutron   File \"/opt/stack/neutron/neutron/plugins/ml2/drivers/type_gre.py\", line 142, in _parse_gre_id_ranges\n2013-07-15 22:07:45.342 20588 TRACE neutron     for e in (entry.split(\u0027:\u0027)[:2] for entry in cfg.\n2013-07-15 22:07:45.342 20588 TRACE neutron   File \"/opt/stack/neutron/neutron/plugins/ml2/drivers/type_gre.py\", line 142, in \u003cgenexpr\u003e\n2013-07-15 22:07:45.342 20588 TRACE neutron     for e in (entry.split(\u0027:\u0027)[:2] for entry in cfg.\n2013-07-15 22:07:45.342 20588 TRACE neutron AttributeError: \u0027list\u0027 object has no attribute \u0027strip\u0027\n2013-07-15 22:07:45.342 20588 TRACE neutron\n\nI think what\u0027s needed is to call strip() on each string in the list returned by entry.split(\u0027:\u0027)[:2] rather than on the list itself.","commit_id":"a692a9581139c5a4d8e0ae31617a445ba3fb97f2"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"unresolved":false,"context_lines":[{"line_number":135,"context_line":"                LOG.warning(_(\"gre_id %s not found\"), gre_id)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _parse_gre_id_ranges(self):"},{"line_number":138,"context_line":"        for entry in cfg.CONF.ml2_type_gre.tunnel_id_ranges:"},{"line_number":139,"context_line":"            entry \u003d entry.strip()"},{"line_number":140,"context_line":"            try:"},{"line_number":141,"context_line":"                tun_min, tun_max \u003d entry.split(\u0027:\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAP3%2F%2Fk3I%3D","line":138,"updated":"2013-07-16 11:35:03.000000000","message":"I couldn\u0027t find a good way to address the stripping problem, so I went back to the previous implementation wich is less efficient","commit_id":"9610de8ca5d03f872c7a3384d3cddd31a736ac1c"}],"neutron/plugins/ml2/drivers/type_tunnel.py":[{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"568f4e92bf8e4c1f0dea0e730e70cc9ebe977fa1","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        # TODO(matrohon) tunnel_type should be a list of every tunnel_type that"},{"line_number":68,"context_line":"        # the agent supports. Should be implemented in bp/ml2-vxlan"},{"line_number":69,"context_line":"        # tunnel_type \u003d kwargs.get(\u0027tunnel_type\u0027)"},{"line_number":70,"context_line":"        tunnel_type \u003d TYPE_GRE"},{"line_number":71,"context_line":"        driver \u003d self.type_manager.drivers.get(tunnel_type)"},{"line_number":72,"context_line":"        if driver:"},{"line_number":73,"context_line":"            tunnel \u003d driver.obj.add_endpoint(tunnel_ip)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2Fw8I%3D","line":70,"updated":"2013-07-11 19:49:28.000000000","message":"In case this and the multiple tunnel types patch both get merged, but the VxlanTypeDriver patch does not get merged, the tunnel_type from kwargs should be used if present. If its missing, then defaulting to TYPE_GRE makes sense. Or the multiple tunnel types patch could be considered a dependency, and tunnel_type from the agent would be required.","commit_id":"44888f33f3ab260fdceb86a6fca26ff6dd08e67f"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":67,"context_line":"        # TODO(matrohon) tunnel_type should be a list of every tunnel_type that"},{"line_number":68,"context_line":"        # the agent supports. Should be implemented in bp/ml2-vxlan"},{"line_number":69,"context_line":"        # tunnel_type \u003d kwargs.get(\u0027tunnel_type\u0027)"},{"line_number":70,"context_line":"        tunnel_type \u003d TYPE_GRE"},{"line_number":71,"context_line":"        driver \u003d self.type_manager.drivers.get(tunnel_type)"},{"line_number":72,"context_line":"        if driver:"},{"line_number":73,"context_line":"            tunnel \u003d driver.obj.add_endpoint(tunnel_ip)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2Fw1k%3D","line":70,"in_reply_to":"AAAAP3%2F%2Fw8I%3D","updated":"2013-07-11 20:02:27.000000000","message":"I\u0027m not going to stack the tunnel_types patch, instead I will simply go the route of defaulting to TYPE_GRE if it\u0027s not in the kwargs.","commit_id":"44888f33f3ab260fdceb86a6fca26ff6dd08e67f"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":72,"context_line":"            entry \u003d {}"},{"line_number":73,"context_line":"            entry[\u0027tunnels\u0027] \u003d tunnels"},{"line_number":74,"context_line":"            # Notify all other listening agents"},{"line_number":75,"context_line":"            self.notifier.tunnel_update(rpc_context, tunnel.ip_address)"},{"line_number":76,"context_line":"            # Return the list of tunnels IP\u0027s to the agent"},{"line_number":77,"context_line":"            return entry"},{"line_number":78,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2Fsbg%3D","line":75,"updated":"2013-07-12 21:23:18.000000000","message":"We need to pass the tunnel_type here.","commit_id":"58a6391f924677719bdf935b5c496923ab5b834a"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":87,"context_line":"                                     TUNNEL,"},{"line_number":88,"context_line":"                                     topics.UPDATE)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def tunnel_update(self, context, tunnel_ip):"},{"line_number":91,"context_line":"        self.fanout_cast(context,"},{"line_number":92,"context_line":"                         self.make_msg(\u0027tunnel_update\u0027,"},{"line_number":93,"context_line":"                                       tunnel_ip\u003dtunnel_ip),"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FsbY%3D","line":90,"updated":"2013-07-12 21:23:18.000000000","message":"And here also.","commit_id":"58a6391f924677719bdf935b5c496923ab5b834a"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":90,"context_line":"    def tunnel_update(self, context, tunnel_ip):"},{"line_number":91,"context_line":"        self.fanout_cast(context,"},{"line_number":92,"context_line":"                         self.make_msg(\u0027tunnel_update\u0027,"},{"line_number":93,"context_line":"                                       tunnel_ip\u003dtunnel_ip),"},{"line_number":94,"context_line":"                         topic\u003dself._get_tunnel_update_topic())"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FsbU%3D","line":93,"updated":"2013-07-12 21:23:18.000000000","message":"And when fanning these out to the agents.","commit_id":"58a6391f924677719bdf935b5c496923ab5b834a"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":69,"context_line":"        if driver:"},{"line_number":70,"context_line":"            tunnel \u003d driver.obj.add_endpoint(tunnel_ip)"},{"line_number":71,"context_line":"            tunnels \u003d driver.obj.get_endpoints()"},{"line_number":72,"context_line":"            entry \u003d {}"},{"line_number":73,"context_line":"            entry[\u0027tunnels\u0027] \u003d tunnels"},{"line_number":74,"context_line":"            # Notify all other listening agents"},{"line_number":75,"context_line":"            self.notifier.tunnel_update(rpc_context, tunnel.ip_address,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Frbc%3D","line":72,"updated":"2013-07-13 17:34:48.000000000","message":"entry \u003d {\u0027tunnels\u0027: tunnels}","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":69,"context_line":"        if driver:"},{"line_number":70,"context_line":"            tunnel \u003d driver.obj.add_endpoint(tunnel_ip)"},{"line_number":71,"context_line":"            tunnels \u003d driver.obj.get_endpoints()"},{"line_number":72,"context_line":"            entry \u003d {}"},{"line_number":73,"context_line":"            entry[\u0027tunnels\u0027] \u003d tunnels"},{"line_number":74,"context_line":"            # Notify all other listening agents"},{"line_number":75,"context_line":"            self.notifier.tunnel_update(rpc_context, tunnel.ip_address,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrHw%3D","line":72,"in_reply_to":"AAAAP3%2F%2Frbc%3D","updated":"2013-07-14 03:38:03.000000000","message":"Done","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"}],"neutron/plugins/ml2/rpc.py":[{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"568f4e92bf8e4c1f0dea0e730e70cc9ebe977fa1","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from neutron.openstack.common.rpc import proxy"},{"line_number":27,"context_line":"from neutron.plugins.ml2 import db"},{"line_number":28,"context_line":"from neutron.plugins.ml2 import driver_api as api"},{"line_number":29,"context_line":"from neutron.plugins.ml2.drivers import type_tunnel"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2Fw4w%3D","line":29,"updated":"2013-07-11 19:49:28.000000000","message":"Ideally, we\u0027d avoid any direct dependency from ml2 plugin  code on driver code. This could probably be accomplished by having the plugin call into the drivers to build up lists of RpcCallback and AgentNotifier mixins that the plugin would use when initializing these classes, and this would allow drivers to add arbitrary RPC methods. \n\nLets not rush to do that yet, but instead add REVISIT comments here about allowing the type and mechanisms drivers to supply the mixins and eventually removing the direct dependencies on type_tunnel.","commit_id":"44888f33f3ab260fdceb86a6fca26ff6dd08e67f"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":26,"context_line":"from neutron.openstack.common.rpc import proxy"},{"line_number":27,"context_line":"from neutron.plugins.ml2 import db"},{"line_number":28,"context_line":"from neutron.plugins.ml2 import driver_api as api"},{"line_number":29,"context_line":"from neutron.plugins.ml2.drivers import type_tunnel"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2Fw2k%3D","line":29,"in_reply_to":"AAAAP3%2F%2Fw4w%3D","updated":"2013-07-11 20:02:27.000000000","message":"Done","commit_id":"44888f33f3ab260fdceb86a6fca26ff6dd08e67f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":47,"context_line":"    #   1.1 Support Security Group RPC"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __init__(self, notifier, type_manager):"},{"line_number":50,"context_line":"        super(RpcCallbacks, self).__init__(notifier, type_manager)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def create_rpc_dispatcher(self):"},{"line_number":53,"context_line":"        \u0027\u0027\u0027Get the rpc dispatcher for this manager."}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAP3%2F%2Fqt0%3D","line":50,"updated":"2013-07-14 19:32:01.000000000","message":"This depends on the first three super classes not having their own __init__ functions. What if an __init__() is added to one of them some day? There does not seem to be a unit test case to catch it?\n\nI am OK with leaving it like this for now, since I see you have a note (line 30) to revisit the mixin for the tunnel type. Let\u0027s make sure this multiple inheritance method resolution order landmine gets cleaned up before someone steps on it.","commit_id":"d2b009229becd8fa0066c7cef47032dbae261c35"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":47,"context_line":"    #   1.1 Support Security Group RPC"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __init__(self, notifier, type_manager):"},{"line_number":50,"context_line":"        super(RpcCallbacks, self).__init__(notifier, type_manager)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def create_rpc_dispatcher(self):"},{"line_number":53,"context_line":"        \u0027\u0027\u0027Get the rpc dispatcher for this manager."}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAP3%2F%2FqbI%3D","line":50,"in_reply_to":"AAAAP3%2F%2Fqt0%3D","updated":"2013-07-15 01:59:06.000000000","message":"Thanks Henry, we\u0027ll make sure to clean this up in H3. I\u0027ll add a REVISIT here as well.","commit_id":"d2b009229becd8fa0066c7cef47032dbae261c35"}],"neutron/plugins/openvswitch/agent/ovs_neutron_agent.py":[{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"unresolved":false,"context_lines":[{"line_number":289,"context_line":"            return"},{"line_number":290,"context_line":"        tunnel_ip \u003d kwargs.get(\u0027tunnel_ip\u0027)"},{"line_number":291,"context_line":"        tunnel_id \u003d kwargs.get(\u0027tunnel_id\u0027)"},{"line_number":292,"context_line":"        if tunnel_id is None:"},{"line_number":293,"context_line":"            tunnel_id \u003d tunnel_ip"},{"line_number":294,"context_line":"        if tunnel_ip \u003d\u003d self.local_ip:"},{"line_number":295,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2F6lk%3D","line":292,"updated":"2013-07-09 09:19:06.000000000","message":"if not tunnel_id","commit_id":"d85ba88240e36bf2b012604a38d0752fa45bec9b"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"4ea0e7bf2942e9f6adcb3793110786a255a4373f","unresolved":false,"context_lines":[{"line_number":289,"context_line":"            return"},{"line_number":290,"context_line":"        tunnel_ip \u003d kwargs.get(\u0027tunnel_ip\u0027)"},{"line_number":291,"context_line":"        tunnel_id \u003d kwargs.get(\u0027tunnel_id\u0027)"},{"line_number":292,"context_line":"        if tunnel_id is None:"},{"line_number":293,"context_line":"            tunnel_id \u003d tunnel_ip"},{"line_number":294,"context_line":"        if tunnel_ip \u003d\u003d self.local_ip:"},{"line_number":295,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2F6GQ%3D","line":292,"in_reply_to":"AAAAP3%2F%2F6lk%3D","updated":"2013-07-09 12:44:38.000000000","message":"Done","commit_id":"d85ba88240e36bf2b012604a38d0752fa45bec9b"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":288,"context_line":"        if not self.enable_tunneling:"},{"line_number":289,"context_line":"            return"},{"line_number":290,"context_line":"        tunnel_ip \u003d kwargs.get(\u0027tunnel_ip\u0027)"},{"line_number":291,"context_line":"        tunnel_id \u003d kwargs.get(\u0027tunnel_id\u0027)"},{"line_number":292,"context_line":"        if not tunnel_id:"},{"line_number":293,"context_line":"            tunnel_id \u003d tunnel_ip"},{"line_number":294,"context_line":"        if tunnel_ip \u003d\u003d self.local_ip:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrbY%3D","line":291,"updated":"2013-07-13 17:34:48.000000000","message":"would tunnel id be \u0027\u0027 or None?  If not, consider:\ntunnel_id \u003d kwargs.get(\u0027tunnel_id\u0027, tunnel_ip)","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":288,"context_line":"        if not self.enable_tunneling:"},{"line_number":289,"context_line":"            return"},{"line_number":290,"context_line":"        tunnel_ip \u003d kwargs.get(\u0027tunnel_ip\u0027)"},{"line_number":291,"context_line":"        tunnel_id \u003d kwargs.get(\u0027tunnel_id\u0027)"},{"line_number":292,"context_line":"        if not tunnel_id:"},{"line_number":293,"context_line":"            tunnel_id \u003d tunnel_ip"},{"line_number":294,"context_line":"        if tunnel_ip \u003d\u003d self.local_ip:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrHc%3D","line":291,"in_reply_to":"AAAAP3%2F%2FrbY%3D","updated":"2013-07-14 03:38:03.000000000","message":"Done","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"unresolved":false,"context_lines":[{"line_number":701,"context_line":""},{"line_number":702,"context_line":"    def tunnel_sync(self):"},{"line_number":703,"context_line":"        resync \u003d False"},{"line_number":704,"context_line":"        try:"},{"line_number":705,"context_line":"            for tunnel_type in self.tunnel_types:"},{"line_number":706,"context_line":"                details \u003d self.plugin_rpc.tunnel_sync(self.context,"},{"line_number":707,"context_line":"                                                      self.local_ip,"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAP3%2F%2Fk3w%3D","line":704,"updated":"2013-07-16 11:35:03.000000000","message":"this for cycle will resolve the bug : https://bugs.launchpad.net/neutron/+bug/1201471","commit_id":"9610de8ca5d03f872c7a3384d3cddd31a736ac1c"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"unresolved":false,"context_lines":[{"line_number":710,"context_line":"                for tunnel in tunnels:"},{"line_number":711,"context_line":"                    if self.local_ip !\u003d tunnel[\u0027ip_address\u0027]:"},{"line_number":712,"context_line":"                        tunnel_id \u003d tunnel.get(\u0027id\u0027, tunnel[\u0027ip_address\u0027])"},{"line_number":713,"context_line":"                        if not tunnel_type:"},{"line_number":714,"context_line":"                            LOG.error(_(\u0027No tunnel_type specified, cannot add \u0027"},{"line_number":715,"context_line":"                                        \u0027tunnel port\u0027))"},{"line_number":716,"context_line":"                            return"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAP3%2F%2Fklk%3D","line":713,"updated":"2013-07-16 13:05:03.000000000","message":"Did you mean to test tunnel_id?","commit_id":"5c67ca07725178e0527bfe0428f0f9a3489dd72e"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"unresolved":false,"context_lines":[{"line_number":710,"context_line":"                for tunnel in tunnels:"},{"line_number":711,"context_line":"                    if self.local_ip !\u003d tunnel[\u0027ip_address\u0027]:"},{"line_number":712,"context_line":"                        tunnel_id \u003d tunnel.get(\u0027id\u0027, tunnel[\u0027ip_address\u0027])"},{"line_number":713,"context_line":"                        if not tunnel_type:"},{"line_number":714,"context_line":"                            LOG.error(_(\u0027No tunnel_type specified, cannot add \u0027"},{"line_number":715,"context_line":"                                        \u0027tunnel port\u0027))"},{"line_number":716,"context_line":"                            return"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAP3%2F%2Fkkc%3D","line":713,"in_reply_to":"AAAAP3%2F%2Fklk%3D","updated":"2013-07-16 13:16:57.000000000","message":"sorry for that! this is old code that i forgot","commit_id":"5c67ca07725178e0527bfe0428f0f9a3489dd72e"}],"neutron/tests/unit/ml2/test_type_gre.py":[{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":145,"context_line":"            segment[api.SEGMENTATION_ID] \u003d tunnel_id"},{"line_number":146,"context_line":"            self.driver.release_segment(self.session, segment)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def test_add_endpoints(self):"},{"line_number":149,"context_line":"        tun_1 \u003d self.driver.add_endpoint(\u0027192.168.0.1\u0027)"},{"line_number":150,"context_line":"        tun_2 \u003d self.driver.add_endpoint(\u0027192.168.0.2\u0027)"},{"line_number":151,"context_line":"        self.assertEquals(\u0027192.168.0.1\u0027, tun_1.ip_address)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAP3%2F%2F1jw%3D","line":148,"updated":"2013-07-10 16:28:28.000000000","message":"Similar to the VXLAN TypeDriver, you should add a unit test for get_endpoints() here as well.","commit_id":"b1c6c94d1f0928db21df025ad00926b4ecc307fa"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"4ea0e7bf2942e9f6adcb3793110786a255a4373f","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            segment[api.SEGMENTATION_ID] \u003d tunnel_id"},{"line_number":146,"context_line":"            self.driver.release_segment(self.session, segment)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def test_add_endpoints(self):"},{"line_number":149,"context_line":"        tun_1 \u003d self.driver.add_endpoint(\u0027192.168.0.1\u0027)"},{"line_number":150,"context_line":"        tun_2 \u003d self.driver.add_endpoint(\u0027192.168.0.2\u0027)"},{"line_number":151,"context_line":"        self.assertEquals(\u0027192.168.0.1\u0027, tun_1.ip_address)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAP3%2F%2Fzaw%3D","line":148,"in_reply_to":"AAAAP3%2F%2F1jw%3D","updated":"2013-07-11 06:37:28.000000000","message":"Done","commit_id":"b1c6c94d1f0928db21df025ad00926b4ecc307fa"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":56,"context_line":"    def test_sync_tunnel_allocations(self):"},{"line_number":57,"context_line":"        self.assertIsNone(self.driver."},{"line_number":58,"context_line":"                          get_gre_allocation(self.session, (TUN_MIN - 1)))"},{"line_number":59,"context_line":"        self.assertFalse(self.driver."},{"line_number":60,"context_line":"                         get_gre_allocation(self.session, (TUN_MIN))."},{"line_number":61,"context_line":"                         allocated)"},{"line_number":62,"context_line":"        self.assertFalse(self.driver."}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrbQ%3D","line":59,"updated":"2013-07-13 17:34:48.000000000","message":"Please reformat to make this and the other testseasier to read.\n\nself.assertFalse(\n    self.driver,\n    get_gre_allocation(self.session, (TUN_MIN)).allocated\n)","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":56,"context_line":"    def test_sync_tunnel_allocations(self):"},{"line_number":57,"context_line":"        self.assertIsNone(self.driver."},{"line_number":58,"context_line":"                          get_gre_allocation(self.session, (TUN_MIN - 1)))"},{"line_number":59,"context_line":"        self.assertFalse(self.driver."},{"line_number":60,"context_line":"                         get_gre_allocation(self.session, (TUN_MIN))."},{"line_number":61,"context_line":"                         allocated)"},{"line_number":62,"context_line":"        self.assertFalse(self.driver."}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrGw%3D","line":59,"in_reply_to":"AAAAP3%2F%2FrbQ%3D","updated":"2013-07-14 03:38:03.000000000","message":"Done","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":123,"context_line":"        tunnel_ids \u003d set()"},{"line_number":124,"context_line":"        for x in xrange(TUN_MIN, TUN_MAX + 1):"},{"line_number":125,"context_line":"            segment \u003d self.driver.allocate_tenant_segment(self.session)"},{"line_number":126,"context_line":"            self.assertThat(segment[api.SEGMENTATION_ID],"},{"line_number":127,"context_line":"                            matchers.GreaterThan(TUN_MIN - 1))"},{"line_number":128,"context_line":"            self.assertThat(segment[api.SEGMENTATION_ID],"},{"line_number":129,"context_line":"                            matchers.LessThan(TUN_MAX + 1))"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrbM%3D","line":126,"updated":"2013-07-13 17:34:48.000000000","message":"Please use the unittest standard forms.\n\nself.assertGreater(\n    segment[api.SEGMENTATION_ID],\n    TUN_MIN - 1\n)","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":125,"context_line":"            segment \u003d self.driver.allocate_tenant_segment(self.session)"},{"line_number":126,"context_line":"            self.assertThat(segment[api.SEGMENTATION_ID],"},{"line_number":127,"context_line":"                            matchers.GreaterThan(TUN_MIN - 1))"},{"line_number":128,"context_line":"            self.assertThat(segment[api.SEGMENTATION_ID],"},{"line_number":129,"context_line":"                            matchers.LessThan(TUN_MAX + 1))"},{"line_number":130,"context_line":"            tunnel_ids.add(segment[api.SEGMENTATION_ID])"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrbI%3D","line":128,"updated":"2013-07-13 17:34:48.000000000","message":"self.assertLess()","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":125,"context_line":"            segment \u003d self.driver.allocate_tenant_segment(self.session)"},{"line_number":126,"context_line":"            self.assertThat(segment[api.SEGMENTATION_ID],"},{"line_number":127,"context_line":"                            matchers.GreaterThan(TUN_MIN - 1))"},{"line_number":128,"context_line":"            self.assertThat(segment[api.SEGMENTATION_ID],"},{"line_number":129,"context_line":"                            matchers.LessThan(TUN_MAX + 1))"},{"line_number":130,"context_line":"            tunnel_ids.add(segment[api.SEGMENTATION_ID])"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrHA%3D","line":128,"in_reply_to":"AAAAP3%2F%2FrbI%3D","updated":"2013-07-14 03:38:03.000000000","message":"Done","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":137,"context_line":"                   api.SEGMENTATION_ID: tunnel_ids.pop()}"},{"line_number":138,"context_line":"        self.driver.release_segment(self.session, segment)"},{"line_number":139,"context_line":"        segment \u003d self.driver.allocate_tenant_segment(self.session)"},{"line_number":140,"context_line":"        self.assertThat(segment[api.SEGMENTATION_ID],"},{"line_number":141,"context_line":"                        matchers.GreaterThan(TUN_MIN - 1))"},{"line_number":142,"context_line":"        self.assertThat(segment[api.SEGMENTATION_ID],"},{"line_number":143,"context_line":"                        matchers.LessThan(TUN_MAX + 1))"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrbE%3D","line":140,"updated":"2013-07-13 17:34:48.000000000","message":"same as above","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":137,"context_line":"                   api.SEGMENTATION_ID: tunnel_ids.pop()}"},{"line_number":138,"context_line":"        self.driver.release_segment(self.session, segment)"},{"line_number":139,"context_line":"        segment \u003d self.driver.allocate_tenant_segment(self.session)"},{"line_number":140,"context_line":"        self.assertThat(segment[api.SEGMENTATION_ID],"},{"line_number":141,"context_line":"                        matchers.GreaterThan(TUN_MIN - 1))"},{"line_number":142,"context_line":"        self.assertThat(segment[api.SEGMENTATION_ID],"},{"line_number":143,"context_line":"                        matchers.LessThan(TUN_MAX + 1))"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrG8%3D","line":140,"in_reply_to":"AAAAP3%2F%2FrbE%3D","updated":"2013-07-14 03:38:03.000000000","message":"Done","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":139,"context_line":"        segment \u003d self.driver.allocate_tenant_segment(self.session)"},{"line_number":140,"context_line":"        self.assertThat(segment[api.SEGMENTATION_ID],"},{"line_number":141,"context_line":"                        matchers.GreaterThan(TUN_MIN - 1))"},{"line_number":142,"context_line":"        self.assertThat(segment[api.SEGMENTATION_ID],"},{"line_number":143,"context_line":"                        matchers.LessThan(TUN_MAX + 1))"},{"line_number":144,"context_line":"        tunnel_ids.add(segment[api.SEGMENTATION_ID])"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrbA%3D","line":142,"updated":"2013-07-13 17:34:48.000000000","message":"same as above","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":139,"context_line":"        segment \u003d self.driver.allocate_tenant_segment(self.session)"},{"line_number":140,"context_line":"        self.assertThat(segment[api.SEGMENTATION_ID],"},{"line_number":141,"context_line":"                        matchers.GreaterThan(TUN_MIN - 1))"},{"line_number":142,"context_line":"        self.assertThat(segment[api.SEGMENTATION_ID],"},{"line_number":143,"context_line":"                        matchers.LessThan(TUN_MAX + 1))"},{"line_number":144,"context_line":"        tunnel_ids.add(segment[api.SEGMENTATION_ID])"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrG4%3D","line":142,"in_reply_to":"AAAAP3%2F%2FrbA%3D","updated":"2013-07-14 03:38:03.000000000","message":"Done","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":150,"context_line":"    def test_gre_endpoints(self):"},{"line_number":151,"context_line":"        tun_1 \u003d self.driver.add_endpoint(TUNNEL_IP_ONE)"},{"line_number":152,"context_line":"        tun_2 \u003d self.driver.add_endpoint(TUNNEL_IP_TWO)"},{"line_number":153,"context_line":"        self.assertEquals(TUNNEL_IP_ONE, tun_1.ip_address)"},{"line_number":154,"context_line":"        self.assertEquals(TUNNEL_IP_TWO, tun_2.ip_address)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Get all the endpoints"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fra8%3D","line":153,"updated":"2013-07-13 17:34:48.000000000","message":"assertEquals is deprecated.  Please use assertEqual()","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":150,"context_line":"    def test_gre_endpoints(self):"},{"line_number":151,"context_line":"        tun_1 \u003d self.driver.add_endpoint(TUNNEL_IP_ONE)"},{"line_number":152,"context_line":"        tun_2 \u003d self.driver.add_endpoint(TUNNEL_IP_TWO)"},{"line_number":153,"context_line":"        self.assertEquals(TUNNEL_IP_ONE, tun_1.ip_address)"},{"line_number":154,"context_line":"        self.assertEquals(TUNNEL_IP_TWO, tun_2.ip_address)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Get all the endpoints"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrHY%3D","line":153,"in_reply_to":"AAAAP3%2F%2Fra8%3D","updated":"2013-07-14 03:38:03.000000000","message":"Done","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":151,"context_line":"        tun_1 \u003d self.driver.add_endpoint(TUNNEL_IP_ONE)"},{"line_number":152,"context_line":"        tun_2 \u003d self.driver.add_endpoint(TUNNEL_IP_TWO)"},{"line_number":153,"context_line":"        self.assertEquals(TUNNEL_IP_ONE, tun_1.ip_address)"},{"line_number":154,"context_line":"        self.assertEquals(TUNNEL_IP_TWO, tun_2.ip_address)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Get all the endpoints"},{"line_number":157,"context_line":"        endpoints \u003d self.driver.get_endpoints()"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fra0%3D","line":154,"updated":"2013-07-13 17:34:48.000000000","message":".assertEqual()","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":151,"context_line":"        tun_1 \u003d self.driver.add_endpoint(TUNNEL_IP_ONE)"},{"line_number":152,"context_line":"        tun_2 \u003d self.driver.add_endpoint(TUNNEL_IP_TWO)"},{"line_number":153,"context_line":"        self.assertEquals(TUNNEL_IP_ONE, tun_1.ip_address)"},{"line_number":154,"context_line":"        self.assertEquals(TUNNEL_IP_TWO, tun_2.ip_address)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Get all the endpoints"},{"line_number":157,"context_line":"        endpoints \u003d self.driver.get_endpoints()"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2FrHU%3D","line":154,"in_reply_to":"AAAAP3%2F%2Fra0%3D","updated":"2013-07-14 03:38:03.000000000","message":"Done","commit_id":"f6869df6e8eb6626ce6dc62a6f3261c9d9ba256d"}],"quantum/openstack/common/rpc/proxy.py":[{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"unresolved":false,"context_lines":[{"line_number":58,"context_line":"        if serializer is None:"},{"line_number":59,"context_line":"            serializer \u003d rpc_serializer.NoOpSerializer()"},{"line_number":60,"context_line":"        self.serializer \u003d serializer"},{"line_number":61,"context_line":"        #super(RpcProxy, self).__init__()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _set_version(self, msg, vers):"},{"line_number":64,"context_line":"        \"\"\"Helper method to set the version in a message."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F1D0%3D","line":61,"updated":"2013-06-20 08:40:14.000000000","message":"why comment it ? why don\u0027t delete it if thinking it\u0027s not necessary ?","commit_id":"9715f6f98269828f954fb38c07eafbe4af84ead6"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"d269b083f6abf1fc16a6029199eb553e47b9e12d","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        if serializer is None:"},{"line_number":59,"context_line":"            serializer \u003d rpc_serializer.NoOpSerializer()"},{"line_number":60,"context_line":"        self.serializer \u003d serializer"},{"line_number":61,"context_line":"        #super(RpcProxy, self).__init__()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _set_version(self, msg, vers):"},{"line_number":64,"context_line":"        \"\"\"Helper method to set the version in a message."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F0fo%3D","line":61,"in_reply_to":"AAAAPn%2F%2F1D0%3D","updated":"2013-06-20 14:02:50.000000000","message":"Done","commit_id":"9715f6f98269828f954fb38c07eafbe4af84ead6"}],"quantum/plugins/ml2/db.py":[{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"53d9886cf0499cd92ad7cf7b67ee724f0d209baa","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        return port_dict"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"def get_gre_endpoints():"},{"line_number":110,"context_line":"    \"\"\"Get every gre endpoints from database.\"\"\""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    LOG.debug(_(\"get_gre_endpoints() called\"))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F8B8%3D","line":109,"updated":"2013-06-17 21:36:00.000000000","message":"Can all these functions be moved to the type_gre driver module? I\u0027d prefer to avoid having plugin code depend directly on any specific driver code if possible, and it seems these can go with the model class definitions.","commit_id":"c52658d44fa5ca044edea8011887f52e977a7d2c"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"bec7ece02133bee2d7b2faf3209f5847b2658761","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from quantum.plugins.ml2 import driver_api as api"},{"line_number":25,"context_line":"from quantum.plugins.ml2 import models"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPn%2F%2FhVw%3D","line":27,"updated":"2013-06-28 16:23:22.000000000","message":"not required","commit_id":"77df0413eb693776d06f965c9980f5ba5da6191b"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"4ea0e7bf2942e9f6adcb3793110786a255a4373f","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from quantum.plugins.ml2 import driver_api as api"},{"line_number":25,"context_line":"from quantum.plugins.ml2 import models"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAP3%2F%2F6xg%3D","line":27,"in_reply_to":"AAAAPn%2F%2FhVw%3D","updated":"2013-07-09 07:58:59.000000000","message":"Done","commit_id":"77df0413eb693776d06f965c9980f5ba5da6191b"}],"quantum/plugins/ml2/drivers/type_gre.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"4d2a65a36b2faea858644abca675fd38c9cb2c97","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                alloc.allocated \u003d False"},{"line_number":110,"context_line":"                inside \u003d False"},{"line_number":111,"context_line":"                for gre_id_range in self.gre_id_ranges:"},{"line_number":112,"context_line":"                    if (gre_id \u003e\u003d gre_id_range[0]"},{"line_number":113,"context_line":"                        and gre_id \u003c\u003d gre_id_range[1]):"},{"line_number":114,"context_line":"                        inside \u003d True"},{"line_number":115,"context_line":"                        break"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F6nc%3D","line":112,"updated":"2013-06-18 11:07:21.000000000","message":"Can use\nif gre_id_range[0] \u003c\u003d gre_id \u003c\u003d gre_id_range[1]:","commit_id":"c52658d44fa5ca044edea8011887f52e977a7d2c"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"unresolved":false,"context_lines":[{"line_number":60,"context_line":"    ip_address \u003d sa.Column(sa.String(64), primary_key\u003dTrue)"},{"line_number":61,"context_line":"    id \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def __init__(self, ip_address, id):"},{"line_number":64,"context_line":"        self.ip_address \u003d ip_address"},{"line_number":65,"context_line":"        self.id \u003d id"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F1F4%3D","line":63,"updated":"2013-06-20 08:40:14.000000000","message":"id is a build-in symbol","commit_id":"9715f6f98269828f954fb38c07eafbe4af84ead6"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"unresolved":false,"context_lines":[{"line_number":65,"context_line":"        self.id \u003d id"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def __repr__(self):"},{"line_number":68,"context_line":"        return \"\u003cTunnelEndpoint(%s,%s)\u003e\" % (self.ip_address, self.id)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"class GreTypeDriver(api.TypeDriver,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F1FU%3D","line":68,"updated":"2013-06-20 08:40:14.000000000","message":"here called TunnelEndpoint, but the class name is GreEndpoints, if it can be distinguished between GRE and VXLAN ?","commit_id":"9715f6f98269828f954fb38c07eafbe4af84ead6"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"unresolved":false,"context_lines":[{"line_number":111,"context_line":"                alloc.allocated \u003d True"},{"line_number":112,"context_line":"                session.add(alloc)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def allocate_tenant_segment(self, session):"},{"line_number":115,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":116,"context_line":"            alloc \u003d (session.query(GreAllocation)."},{"line_number":117,"context_line":"                     filter_by(allocated\u003dFalse)."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F1DQ%3D","line":114,"updated":"2013-06-20 08:40:14.000000000","message":"is it possible to have a super-class to reduce the code redundant between type_vlan and type_gre and other segment tunnel plugin in the future ? VlanAllocation and GreAllocation also looks very similar.","commit_id":"9715f6f98269828f954fb38c07eafbe4af84ead6"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"d269b083f6abf1fc16a6029199eb553e47b9e12d","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                alloc.allocated \u003d True"},{"line_number":112,"context_line":"                session.add(alloc)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def allocate_tenant_segment(self, session):"},{"line_number":115,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":116,"context_line":"            alloc \u003d (session.query(GreAllocation)."},{"line_number":117,"context_line":"                     filter_by(allocated\u003dFalse)."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F0pY%3D","line":114,"in_reply_to":"AAAAPn%2F%2F1DQ%3D","updated":"2013-06-20 14:02:50.000000000","message":"type_vlan and type_gre looks very similar since they both implement TypeDriver abstract class, but they don\u0027t need to check the same attributes (vlan type needs  PHYSICAL_NETWORK attribute whereas type_gre only needs SEGMENTATION_ID attribute, and type_vxlan may also need a multicast attribute) and they don\u0027t rely on the same databases, they both have their own one. I don\u0027t know if using a super class is relevant here.","commit_id":"9715f6f98269828f954fb38c07eafbe4af84ead6"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"bec7ece02133bee2d7b2faf3209f5847b2658761","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            try:"},{"line_number":201,"context_line":"                alloc \u003d (session.query(GreAllocation)."},{"line_number":202,"context_line":"                         filter_by(gre_id\u003dgre_id)."},{"line_number":203,"context_line":"                         with_lockmode(\u0027update\u0027).one())"},{"line_number":204,"context_line":"                return alloc"},{"line_number":205,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":206,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPn%2F%2FhUo%3D","line":203,"updated":"2013-06-28 16:23:22.000000000","message":"why \u0027with_lockmode\u0027?","commit_id":"77df0413eb693776d06f965c9980f5ba5da6191b"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"4ea0e7bf2942e9f6adcb3793110786a255a4373f","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            try:"},{"line_number":201,"context_line":"                alloc \u003d (session.query(GreAllocation)."},{"line_number":202,"context_line":"                         filter_by(gre_id\u003dgre_id)."},{"line_number":203,"context_line":"                         with_lockmode(\u0027update\u0027).one())"},{"line_number":204,"context_line":"                return alloc"},{"line_number":205,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":206,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAP3%2F%2F6x0%3D","line":203,"in_reply_to":"AAAAPn%2F%2FhUo%3D","updated":"2013-07-09 07:58:59.000000000","message":"Done","commit_id":"77df0413eb693776d06f965c9980f5ba5da6191b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"bec7ece02133bee2d7b2faf3209f5847b2658761","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            try:"},{"line_number":224,"context_line":"                gre_endpoint \u003d (session.query(GreEndpoints)."},{"line_number":225,"context_line":"                                filter_by(ip_address\u003dip)."},{"line_number":226,"context_line":"                                with_lockmode(\u0027update\u0027).one())"},{"line_number":227,"context_line":"                LOG.warning(_(\"Gre endpoint with ip %s already exists\"), ip)"},{"line_number":228,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":229,"context_line":"                gre_endpoint \u003d GreEndpoints(ip)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPn%2F%2FhUs%3D","line":226,"updated":"2013-06-28 16:23:22.000000000","message":"why \u0027with_lockmode\u0027?","commit_id":"77df0413eb693776d06f965c9980f5ba5da6191b"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"4ea0e7bf2942e9f6adcb3793110786a255a4373f","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            try:"},{"line_number":224,"context_line":"                gre_endpoint \u003d (session.query(GreEndpoints)."},{"line_number":225,"context_line":"                                filter_by(ip_address\u003dip)."},{"line_number":226,"context_line":"                                with_lockmode(\u0027update\u0027).one())"},{"line_number":227,"context_line":"                LOG.warning(_(\"Gre endpoint with ip %s already exists\"), ip)"},{"line_number":228,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":229,"context_line":"                gre_endpoint \u003d GreEndpoints(ip)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAP3%2F%2F6xw%3D","line":226,"in_reply_to":"AAAAPn%2F%2FhUs%3D","updated":"2013-07-09 07:58:59.000000000","message":"Done","commit_id":"77df0413eb693776d06f965c9980f5ba5da6191b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"bec7ece02133bee2d7b2faf3209f5847b2658761","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":229,"context_line":"                gre_endpoint \u003d GreEndpoints(ip)"},{"line_number":230,"context_line":"                session.add(gre_endpoint)"},{"line_number":231,"context_line":"                session.flush()"},{"line_number":232,"context_line":"            return gre_endpoint"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPn%2F%2FhU0%3D","line":231,"updated":"2013-06-28 16:23:22.000000000","message":"flush is not needed","commit_id":"77df0413eb693776d06f965c9980f5ba5da6191b"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"4ea0e7bf2942e9f6adcb3793110786a255a4373f","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":229,"context_line":"                gre_endpoint \u003d GreEndpoints(ip)"},{"line_number":230,"context_line":"                session.add(gre_endpoint)"},{"line_number":231,"context_line":"                session.flush()"},{"line_number":232,"context_line":"            return gre_endpoint"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAP3%2F%2F6xs%3D","line":231,"in_reply_to":"AAAAPn%2F%2FhU0%3D","updated":"2013-07-09 07:58:59.000000000","message":"Done","commit_id":"77df0413eb693776d06f965c9980f5ba5da6191b"}],"quantum/plugins/ml2/drivers/type_tunnel.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"4d2a65a36b2faea858644abca675fd38c9cb2c97","unresolved":false,"context_lines":[{"line_number":25,"context_line":"TYPE_GRE \u003d \u0027gre\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class TunnelTypeDriver(object):"},{"line_number":28,"context_line":"    "},{"line_number":29,"context_line":"    __metaclass__ \u003d ABCMeta"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2F3fM%3D","line":28,"updated":"2013-06-19 13:58:18.000000000","message":"Four places (in red) with extraneous whitespace.","commit_id":"7896da58bca6e8ef2aad2e83d4669fb6b57cc653"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"unresolved":false,"context_lines":[{"line_number":30,"context_line":"    __metaclass__ \u003d ABCMeta"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @abstractmethod"},{"line_number":33,"context_line":"    def add_endpoint(self):"},{"line_number":34,"context_line":"        pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F1G4%3D","line":33,"updated":"2013-06-20 08:40:14.000000000","message":"Parameter declaration does not match with it\u0027s subclass GreTypeDriver (  def add_endpoint(self, ip): )\nso if it\u0027s missing a parameter named \"ip\" ?","commit_id":"9715f6f98269828f954fb38c07eafbe4af84ead6"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"d269b083f6abf1fc16a6029199eb553e47b9e12d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    __metaclass__ \u003d ABCMeta"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @abstractmethod"},{"line_number":33,"context_line":"    def add_endpoint(self):"},{"line_number":34,"context_line":"        pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @abstractmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F0ow%3D","line":33,"in_reply_to":"AAAAPn%2F%2F1G4%3D","updated":"2013-06-20 14:02:50.000000000","message":"Done","commit_id":"9715f6f98269828f954fb38c07eafbe4af84ead6"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @abstractmethod"},{"line_number":33,"context_line":"    def add_endpoint(self):"},{"line_number":34,"context_line":"        pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @abstractmethod"},{"line_number":37,"context_line":"    def get_endpoints(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F1Gk%3D","line":34,"updated":"2013-06-20 08:40:14.000000000","message":"I also think it should have comment here since it\u0027s a abstract method","commit_id":"9715f6f98269828f954fb38c07eafbe4af84ead6"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"d269b083f6abf1fc16a6029199eb553e47b9e12d","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @abstractmethod"},{"line_number":33,"context_line":"    def add_endpoint(self):"},{"line_number":34,"context_line":"        pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @abstractmethod"},{"line_number":37,"context_line":"    def get_endpoints(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F0n8%3D","line":34,"in_reply_to":"AAAAPn%2F%2F1Gk%3D","updated":"2013-06-20 14:02:50.000000000","message":"Done","commit_id":"9715f6f98269828f954fb38c07eafbe4af84ead6"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @abstractmethod"},{"line_number":37,"context_line":"    def get_endpoints(self):"},{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class TunnelRpcCallbackMixin(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F1Gg%3D","line":38,"updated":"2013-06-20 08:40:14.000000000","message":"I also think it should have comment here since it\u0027s a abstract method","commit_id":"9715f6f98269828f954fb38c07eafbe4af84ead6"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"d269b083f6abf1fc16a6029199eb553e47b9e12d","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @abstractmethod"},{"line_number":37,"context_line":"    def get_endpoints(self):"},{"line_number":38,"context_line":"        pass"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class TunnelRpcCallbackMixin(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F0n4%3D","line":38,"in_reply_to":"AAAAPn%2F%2F1Gg%3D","updated":"2013-06-20 14:02:50.000000000","message":"Done","commit_id":"9715f6f98269828f954fb38c07eafbe4af84ead6"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"unresolved":false,"context_lines":[{"line_number":78,"context_line":"                                     TUNNEL,"},{"line_number":79,"context_line":"                                     topics.UPDATE)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def tunnel_update(self, context, tunnel_ip, tunnel_id):"},{"line_number":82,"context_line":"        self.fanout_cast(context,"},{"line_number":83,"context_line":"                         self.make_msg(\u0027tunnel_update\u0027,"},{"line_number":84,"context_line":"                                       tunnel_ip\u003dtunnel_ip,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FzYA%3D","line":81,"updated":"2013-06-20 21:26:02.000000000","message":"My patch here updates the tunnel_update RPC call to include a tunnel_type parameter. If my patch gets merged before this, we\u0027ll want to update this code. For reference, the review in question is here:\n\nhttps://review.openstack.org/#/c/33107/","commit_id":"9715f6f98269828f954fb38c07eafbe4af84ead6"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"bec7ece02133bee2d7b2faf3209f5847b2658761","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        if driver:"},{"line_number":73,"context_line":"            tunnel \u003d driver.obj.add_endpoint(tunnel_ip)"},{"line_number":74,"context_line":"            tunnels \u003d driver.obj.get_endpoints()"},{"line_number":75,"context_line":"            entry \u003d dict()"},{"line_number":76,"context_line":"            entry[\u0027tunnels\u0027] \u003d tunnels"},{"line_number":77,"context_line":"            # Notify all other listening agents"},{"line_number":78,"context_line":"            self.notifier.tunnel_update(rpc_context, tunnel.ip_address)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPn%2F%2FhUM%3D","line":75,"updated":"2013-06-28 16:23:22.000000000","message":"nit: dict() -\u003e {}","commit_id":"77df0413eb693776d06f965c9980f5ba5da6191b"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"4ea0e7bf2942e9f6adcb3793110786a255a4373f","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        if driver:"},{"line_number":73,"context_line":"            tunnel \u003d driver.obj.add_endpoint(tunnel_ip)"},{"line_number":74,"context_line":"            tunnels \u003d driver.obj.get_endpoints()"},{"line_number":75,"context_line":"            entry \u003d dict()"},{"line_number":76,"context_line":"            entry[\u0027tunnels\u0027] \u003d tunnels"},{"line_number":77,"context_line":"            # Notify all other listening agents"},{"line_number":78,"context_line":"            self.notifier.tunnel_update(rpc_context, tunnel.ip_address)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAP3%2F%2F6xQ%3D","line":75,"in_reply_to":"AAAAPn%2F%2FhUM%3D","updated":"2013-07-09 07:58:59.000000000","message":"Done","commit_id":"77df0413eb693776d06f965c9980f5ba5da6191b"}],"quantum/plugins/ml2/rpc.py":[{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"7daea327f3e007125e9dd1185f956f90d53d2821","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    # TODO(rkukura) Add tunnel_sync() here if not implemented via a"},{"line_number":161,"context_line":"    # driver."},{"line_number":162,"context_line":"    def tunnel_sync(self, rpc_context, **kwargs):"},{"line_number":163,"context_line":"        \"\"\"Update new tunnel."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        Updates the datbase with the tunnel IP. All listening agents will also"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F8sc%3D","line":162,"updated":"2013-06-17 16:23:04.000000000","message":"This looks good, as it\u0027s the same code as in the OVS server. I\u0027ll be modifying this code to support multiple tunnel types after this change goes upstream.","commit_id":"c52658d44fa5ca044edea8011887f52e977a7d2c"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"aac859002f148ebeaf73dff37d679f53b50c52f3","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    # TODO(rkukura) Add tunnel_sync() here if not implemented via a"},{"line_number":161,"context_line":"    # driver."},{"line_number":162,"context_line":"    def tunnel_sync(self, rpc_context, **kwargs):"},{"line_number":163,"context_line":"        \"\"\"Update new tunnel."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        Updates the datbase with the tunnel IP. All listening agents will also"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F7XU%3D","line":162,"in_reply_to":"AAAAPn%2F%2F79o%3D","updated":"2013-06-18 02:58:39.000000000","message":"I am fine with either case above. I can certainly make the changes to allow for the tunnel_type to be pluggable with the VXLAN type driver code.","commit_id":"c52658d44fa5ca044edea8011887f52e977a7d2c"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"53d9886cf0499cd92ad7cf7b67ee724f0d209baa","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    # TODO(rkukura) Add tunnel_sync() here if not implemented via a"},{"line_number":161,"context_line":"    # driver."},{"line_number":162,"context_line":"    def tunnel_sync(self, rpc_context, **kwargs):"},{"line_number":163,"context_line":"        \"\"\"Update new tunnel."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        Updates the datbase with the tunnel IP. All listening agents will also"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2F79o%3D","line":162,"in_reply_to":"AAAAPn%2F%2F8sc%3D","updated":"2013-06-17 21:36:00.000000000","message":"Is there any easy way now to avoid directly calling GRE-specific code? I\u0027d prefer not to set a precedent of direct access from the plugin code to any specific driver code being acceptable. \n\nIf the RPC is going to be modified to pass the tunnel type in, maybe we could hardcode tunnel_type to \u0027gre\u0027 for now (with a TODO comment), and then dispatch to a TypeDriver based on tunnel_type. Or maybe there is some other/better plan in the works for supporting multiple tunnel types.\n\nIf the plan is to directly access GRE-specific code for now, and then make it pluggable when VXLAN is added, I guess that\u0027s OK, but I\u0027d like to see TODO or REVISIT comments in each case.","commit_id":"c52658d44fa5ca044edea8011887f52e977a7d2c"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"4d2a65a36b2faea858644abca675fd38c9cb2c97","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def __init__(self, notifier, type_manager):"},{"line_number":48,"context_line":"        super(RpcCallbacks, self).__init__(notifier, type_manager)"},{"line_number":49,"context_line":"        "},{"line_number":50,"context_line":"    def create_rpc_dispatcher(self):"},{"line_number":51,"context_line":"        \u0027\u0027\u0027Get the rpc dispatcher for this manager."},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2F3fY%3D","line":49,"updated":"2013-06-19 13:58:18.000000000","message":"Remove extraneous whitespace","commit_id":"7896da58bca6e8ef2aad2e83d4669fb6b57cc653"}],"quantum/plugins/openvswitch/agent/ovs_quantum_agent.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"6d2d07e6951835dc3892bcdbc87586ef554b2295","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            return"},{"line_number":289,"context_line":"        tunnel_ip \u003d kwargs.get(\u0027tunnel_ip\u0027)"},{"line_number":290,"context_line":"        tunnel_id \u003d kwargs.get(\u0027tunnel_id\u0027)"},{"line_number":291,"context_line":"        if (tunnel_id \u003d\u003d None):"},{"line_number":292,"context_line":"            tunnel_id \u003d tunnel_ip"},{"line_number":293,"context_line":"        if tunnel_ip \u003d\u003d self.local_ip:"},{"line_number":294,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2Fm34%3D","line":291,"updated":"2013-06-26 20:44:06.000000000","message":"if tunnel_id is None:","commit_id":"db1997cb46a989d52b53e46265e1fd3ac8a70c73"}]}
