)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":7,"context_line":"_validate_security_groups_on_port was not validating external_ids"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The function _validate_security_groups_on_port was not validating a ports"},{"line_number":10,"context_line":"security group id if the id was an external id. Fixes bug 1095864"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I0ec7f9ed36f1a46156c47a115be936bb41ef75d9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAAM3%2F%2Fx34%3D","line":10,"updated":"2013-01-05 10:00:58.000000000","message":"I think there\u0027s a convention to put the reference to the bug on a separate line, but that does not matter to me.","commit_id":"a39d42efde1dce5873ef034e6b6c53ec37aaf69c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":7,"context_line":"_validate_security_groups_on_port was not validating external_ids"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The function _validate_security_groups_on_port was not validating a ports"},{"line_number":10,"context_line":"security group id if the id was an external id. Fixes bug 1095864"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I0ec7f9ed36f1a46156c47a115be936bb41ef75d9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAAM3%2F%2FwDY%3D","line":10,"in_reply_to":"AAAAM3%2F%2Fx34%3D","updated":"2013-01-07 18:15:57.000000000","message":"Done","commit_id":"a39d42efde1dce5873ef034e6b6c53ec37aaf69c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Aaron Rosen \u003carosen@nicira.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-01-11 15:32:34 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"_validate_security_groups_on_port was not validating external_ids"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The function _validate_security_groups_on_port was not validating a ports"},{"line_number":10,"context_line":"security group id if the id was an external id. This patch also now uses"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAM3%2F%2Fn2U%3D","line":7,"updated":"2013-01-12 09:14:11.000000000","message":"Now this method is removed and integrated into get_security_group_on_port, so we need to update the commit message.","commit_id":"6536b098c6d42a64c6ac4c8ecf430c3abc62a437"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Aaron Rosen \u003carosen@nicira.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-01-11 15:32:34 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"_validate_security_groups_on_port was not validating external_ids"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The function _validate_security_groups_on_port was not validating a ports"},{"line_number":10,"context_line":"security group id if the id was an external id. This patch also now uses"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAM3%2F%2FmMc%3D","line":7,"in_reply_to":"AAAAM3%2F%2Fn2U%3D","updated":"2013-01-14 17:47:55.000000000","message":"Done","commit_id":"6536b098c6d42a64c6ac4c8ecf430c3abc62a437"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The function _validate_security_groups_on_port was not validating a ports"},{"line_number":10,"context_line":"security group id if the id was an external id. This patch also now uses"},{"line_number":11,"context_line":"set_override() rather than setting cfg values directly."},{"line_number":12,"context_line":"Fixes bug 1095864"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I0ec7f9ed36f1a46156c47a115be936bb41ef75d9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAM3%2F%2Fn2Q%3D","line":11,"updated":"2013-01-12 09:14:11.000000000","message":"Where is set_override() used? I could not find where it is used.","commit_id":"6536b098c6d42a64c6ac4c8ecf430c3abc62a437"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The function _validate_security_groups_on_port was not validating a ports"},{"line_number":10,"context_line":"security group id if the id was an external id. This patch also now uses"},{"line_number":11,"context_line":"set_override() rather than setting cfg values directly."},{"line_number":12,"context_line":"Fixes bug 1095864"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I0ec7f9ed36f1a46156c47a115be936bb41ef75d9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAM3%2F%2FmMU%3D","line":11,"in_reply_to":"AAAAM3%2F%2Fn2Q%3D","updated":"2013-01-14 17:47:55.000000000","message":"See in the quantum/tests/unit/test_extension_security_group.py in this patch set.","commit_id":"6536b098c6d42a64c6ac4c8ecf430c3abc62a437"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The function _validate_security_groups_on_port was not validating a ports"},{"line_number":10,"context_line":"security group id if the id was an external id. This patch also now uses"},{"line_number":11,"context_line":"set_override() rather than setting cfg values directly."},{"line_number":12,"context_line":"Fixes bug 1095864"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I0ec7f9ed36f1a46156c47a115be936bb41ef75d9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAM3%2F%2Fjm4%3D","line":11,"updated":"2013-01-16 03:04:28.000000000","message":"According to your previous comment set_override() is just used in the unit tests, so it would be better to note it (by replacing \"This patch also now uses\" to \"The unit tests now use\")","commit_id":"4569dd820a8adfc1e359ae0f0de2879027827039"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The function _validate_security_groups_on_port was not validating a ports"},{"line_number":10,"context_line":"security group id if the id was an external id. This patch also now uses"},{"line_number":11,"context_line":"set_override() rather than setting cfg values directly."},{"line_number":12,"context_line":"Fixes bug 1095864"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I0ec7f9ed36f1a46156c47a115be936bb41ef75d9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAM3%2F%2FjlE%3D","line":11,"in_reply_to":"AAAAM3%2F%2Fjm4%3D","updated":"2013-01-16 03:25:59.000000000","message":"Done","commit_id":"4569dd820a8adfc1e359ae0f0de2879027827039"}],"quantum/db/securitygroups_db.py":[{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"cca719fec3988d37b495d88fc50bee6ebb414642","unresolved":false,"context_lines":[{"line_number":463,"context_line":"                    break"},{"line_number":464,"context_line":"            else:"},{"line_number":465,"context_line":"                raise ext_sg.SecurityGroupNotFound(id\u003dsg_id)"},{"line_number":466,"context_line":"        return security_group_ids"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2F0F4%3D","line":466,"updated":"2013-01-04 02:42:03.000000000","message":"In my opinion, _validate_xxx should raise some exception instead of returning some thing.","commit_id":"4fc6178e51725e461409df17ffcad6e6f7e5fa87"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":463,"context_line":"                    break"},{"line_number":464,"context_line":"            else:"},{"line_number":465,"context_line":"                raise ext_sg.SecurityGroupNotFound(id\u003dsg_id)"},{"line_number":466,"context_line":"        return security_group_ids"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2F0Ew%3D","line":466,"in_reply_to":"AAAAM3%2F%2F0F4%3D","updated":"2013-01-04 03:31:54.000000000","message":"Done","commit_id":"4fc6178e51725e461409df17ffcad6e6f7e5fa87"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":443,"context_line":"        else:"},{"line_number":444,"context_line":"            return default_group[0][\u0027id\u0027]"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    def _get_security_groups_on_port(self, context, port):"},{"line_number":447,"context_line":"        \"\"\"Check that all security groups on port belong to tenant."},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        :returns: the quantum uuid value if an external_id was passed in."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2F0CQ%3D","line":446,"updated":"2013-01-04 04:07:13.000000000","message":"it seems _validate_security_groups_on_port is not used in code, why do we need it?","commit_id":"44a8f6aa422b348e1ad90b9c06d2de711a8db22d"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":443,"context_line":"        else:"},{"line_number":444,"context_line":"            return default_group[0][\u0027id\u0027]"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    def _get_security_groups_on_port(self, context, port):"},{"line_number":447,"context_line":"        \"\"\"Check that all security groups on port belong to tenant."},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        :returns: the quantum uuid value if an external_id was passed in."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2F0Bg%3D","line":446,"in_reply_to":"AAAAM3%2F%2F0B0%3D","updated":"2013-01-04 04:18:39.000000000","message":"sorry, I just see it is used in test codes.","commit_id":"44a8f6aa422b348e1ad90b9c06d2de711a8db22d"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        else:"},{"line_number":444,"context_line":"            return default_group[0][\u0027id\u0027]"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    def _get_security_groups_on_port(self, context, port):"},{"line_number":447,"context_line":"        \"\"\"Check that all security groups on port belong to tenant."},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        :returns: the quantum uuid value if an external_id was passed in."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2F0B0%3D","line":446,"in_reply_to":"AAAAM3%2F%2F0CQ%3D","updated":"2013-01-04 04:12:16.000000000","message":"It\u0027s used in quantum/tests/unit/test_extension_security_group.py line 170 (in this patch set) for the mock plugin. The NVP plugin also uses it which i\u0027ll be posting shortly. Also the function is now called _get not _validate.","commit_id":"44a8f6aa422b348e1ad90b9c06d2de711a8db22d"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":444,"context_line":"            return default_group[0][\u0027id\u0027]"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    def _get_security_groups_on_port(self, context, port):"},{"line_number":447,"context_line":"        \"\"\"Check that all security groups on port belong to tenant."},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        :returns: the quantum uuid value if an external_id was passed in."},{"line_number":450,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2Fz%2Bw%3D","line":447,"updated":"2013-01-04 06:36:00.000000000","message":"Then I guess the doc string should be \"Returns all security groups IDs on port belonging to tenant\"","commit_id":"44a8f6aa422b348e1ad90b9c06d2de711a8db22d"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":444,"context_line":"            return default_group[0][\u0027id\u0027]"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    def _get_security_groups_on_port(self, context, port):"},{"line_number":447,"context_line":"        \"\"\"Check that all security groups on port belong to tenant."},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        :returns: the quantum uuid value if an external_id was passed in."},{"line_number":450,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FzEw%3D","line":447,"in_reply_to":"AAAAM3%2F%2Fz%2Bw%3D","updated":"2013-01-04 19:21:16.000000000","message":"Done","commit_id":"44a8f6aa422b348e1ad90b9c06d2de711a8db22d"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":454,"context_line":"            return []"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        valid_groups \u003d self.get_security_groups("},{"line_number":457,"context_line":"            context, fields\u003d[\u0027external_id\u0027, \u0027id\u0027])"},{"line_number":458,"context_line":"        for sg_id in p.get(ext_sg.SECURITYGROUP, []):"},{"line_number":459,"context_line":"            for valid_group in valid_groups:"},{"line_number":460,"context_line":"                if (sg_id \u003d\u003d valid_group[\u0027id\u0027] or"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2Fz%2Bc%3D","line":457,"updated":"2013-01-04 06:09:57.000000000","message":"Consider this alternate:\n\nvalid_group_map \u003d dict((g[\u0027id\u0027], g[\u0027id\u0027]) for g in valid_groups)\n\nvalid_group_map.update((g[\u0027external_id\u0027], g[\u0027id\u0027]) for g in valid_groups if g.get(\u0027external_id\u0027))\n\ntry:\n  return [valid_group_map[sg_id] for sg_id in p.get(ext_sg.SECURITYGROUP, [])]\nexcept KeyError, e:\n   raise ext_sg.SecurityGroupNotFound(id\u003de.message)","commit_id":"44a8f6aa422b348e1ad90b9c06d2de711a8db22d"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":454,"context_line":"            return []"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        valid_groups \u003d self.get_security_groups("},{"line_number":457,"context_line":"            context, fields\u003d[\u0027external_id\u0027, \u0027id\u0027])"},{"line_number":458,"context_line":"        for sg_id in p.get(ext_sg.SECURITYGROUP, []):"},{"line_number":459,"context_line":"            for valid_group in valid_groups:"},{"line_number":460,"context_line":"                if (sg_id \u003d\u003d valid_group[\u0027id\u0027] or"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2Fz8A%3D","line":457,"in_reply_to":"AAAAM3%2F%2Fz%2Bc%3D","updated":"2013-01-04 06:36:00.000000000","message":"Shouldn\u0027t this line\n\nvalid_group_map.update((g[\u0027external_id\u0027], g[\u0027id\u0027]) for g in valid_groups if g.get(\u0027external_id\u0027))\n\nbe\n\nvalid_group_map.update(dict([(g[\u0027external_id\u0027], g[\u0027id\u0027]) for g in valid_groups if g.get(\u0027external_id\u0027)])\n\n? I like this approach","commit_id":"44a8f6aa422b348e1ad90b9c06d2de711a8db22d"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":454,"context_line":"            return []"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        valid_groups \u003d self.get_security_groups("},{"line_number":457,"context_line":"            context, fields\u003d[\u0027external_id\u0027, \u0027id\u0027])"},{"line_number":458,"context_line":"        for sg_id in p.get(ext_sg.SECURITYGROUP, []):"},{"line_number":459,"context_line":"            for valid_group in valid_groups:"},{"line_number":460,"context_line":"                if (sg_id \u003d\u003d valid_group[\u0027id\u0027] or"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FzEA%3D","line":457,"in_reply_to":"AAAAM3%2F%2Fz%2Bc%3D","updated":"2013-01-04 19:21:16.000000000","message":"Thanks mark I agree this is better.","commit_id":"44a8f6aa422b348e1ad90b9c06d2de711a8db22d"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":454,"context_line":"            return []"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        valid_groups \u003d self.get_security_groups("},{"line_number":457,"context_line":"            context, fields\u003d[\u0027external_id\u0027, \u0027id\u0027])"},{"line_number":458,"context_line":"        for sg_id in p.get(ext_sg.SECURITYGROUP, []):"},{"line_number":459,"context_line":"            for valid_group in valid_groups:"},{"line_number":460,"context_line":"                if (sg_id \u003d\u003d valid_group[\u0027id\u0027] or"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2Fz7w%3D","line":457,"in_reply_to":"AAAAM3%2F%2Fz8A%3D","updated":"2013-01-04 06:37:13.000000000","message":"oh you can update from an iterable. ignore my comment.","commit_id":"44a8f6aa422b348e1ad90b9c06d2de711a8db22d"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":463,"context_line":"                    break"},{"line_number":464,"context_line":"            else:"},{"line_number":465,"context_line":"                raise ext_sg.SecurityGroupNotFound(id\u003dsg_id)"},{"line_number":466,"context_line":"        return security_group_ids"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2Fz9I%3D","line":466,"updated":"2013-01-04 06:36:00.000000000","message":"How about caching some values to reduce hash lookup\n\n        p \u003d port[\u0027port\u0027]\n        port_sg_ids \u003d p.get(ext_sg.SECURITYGROUPS)\n        if not port_sg_ids:\n            return []\n\n        security_group_ids \u003d []\n        valid_groups \u003d self.get_security_groups(\n            context, fields\u003d[\u0027external_id\u0027, \u0027id\u0027])\n        for sg_id in port_sg_ids:\n            for valid_group in valid_groups:\n                valid_group_id \u003d valid_group[\u0027id\u0027]\n                if (sg_id \u003d\u003d valid_group_id or\n                    sg_id \u003d\u003d valid_group.get(\u0027external_id\u0027)):\n                    security_group_ids.append(valid_group_id)\n                    break\n            else:\n                raise ext_sg.SecurityGroupNotFound(id\u003dsg_id)\n        return security_group_ids","commit_id":"44a8f6aa422b348e1ad90b9c06d2de711a8db22d"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":463,"context_line":"                    break"},{"line_number":464,"context_line":"            else:"},{"line_number":465,"context_line":"                raise ext_sg.SecurityGroupNotFound(id\u003dsg_id)"},{"line_number":466,"context_line":"        return security_group_ids"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FzDk%3D","line":466,"in_reply_to":"AAAAM3%2F%2Fz9I%3D","updated":"2013-01-04 19:21:16.000000000","message":"The amount of security groups associated with a port should be so low that it shouldn\u0027t really matter. Also, shortly the external_id field will be removed from quantum once nova security calls are proxied directly.","commit_id":"44a8f6aa422b348e1ad90b9c06d2de711a8db22d"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":443,"context_line":"        else:"},{"line_number":444,"context_line":"            return default_group[0][\u0027id\u0027]"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    def _get_security_groups_on_port(self, context, port):"},{"line_number":447,"context_line":"        \"\"\"Check that all security groups on port belong to tenant."},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        :returns: the quantum uuid value if an external_id was passed in."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2Fx3E%3D","line":446,"updated":"2013-01-05 10:00:58.000000000","message":"Where is this method used? I found references to it in unit tests only? Is it invoked via some form of reflection?","commit_id":"a39d42efde1dce5873ef034e6b6c53ec37aaf69c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        else:"},{"line_number":444,"context_line":"            return default_group[0][\u0027id\u0027]"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    def _get_security_groups_on_port(self, context, port):"},{"line_number":447,"context_line":"        \"\"\"Check that all security groups on port belong to tenant."},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        :returns: the quantum uuid value if an external_id was passed in."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2FwGg%3D","line":446,"in_reply_to":"AAAAM3%2F%2Fx3E%3D","updated":"2013-01-07 18:15:57.000000000","message":"Yes this is invoked only in the unit tests right now. The NVP plugin will also use this method.","commit_id":"a39d42efde1dce5873ef034e6b6c53ec37aaf69c"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":458,"context_line":"        for sg_id in p.get(ext_sg.SECURITYGROUP, []):"},{"line_number":459,"context_line":"            for valid_group in valid_groups:"},{"line_number":460,"context_line":"                if (sg_id \u003d\u003d valid_group[\u0027id\u0027] or"},{"line_number":461,"context_line":"                    sg_id \u003d\u003d valid_group.get(\u0027external_id\u0027)):"},{"line_number":462,"context_line":"                    security_group_ids.append(valid_group[\u0027id\u0027])"},{"line_number":463,"context_line":"                    break"},{"line_number":464,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2Fx3A%3D","line":461,"updated":"2013-01-05 10:00:58.000000000","message":"if sg_id is an external id, rather than a real security group id, then how does the binding table behave, since it requires a foreign key to securitygroups.id?","commit_id":"a39d42efde1dce5873ef034e6b6c53ec37aaf69c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":458,"context_line":"        for sg_id in p.get(ext_sg.SECURITYGROUP, []):"},{"line_number":459,"context_line":"            for valid_group in valid_groups:"},{"line_number":460,"context_line":"                if (sg_id \u003d\u003d valid_group[\u0027id\u0027] or"},{"line_number":461,"context_line":"                    sg_id \u003d\u003d valid_group.get(\u0027external_id\u0027)):"},{"line_number":462,"context_line":"                    security_group_ids.append(valid_group[\u0027id\u0027])"},{"line_number":463,"context_line":"                    break"},{"line_number":464,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2FwGM%3D","line":461,"in_reply_to":"AAAAM3%2F%2Fx3A%3D","updated":"2013-01-07 18:15:57.000000000","message":"A security group is created and there is an extra column where the external id is populated. Internally it uses securitygroups.id. The external_id is only needed because that\u0027s the only id that nova knows about.","commit_id":"a39d42efde1dce5873ef034e6b6c53ec37aaf69c"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":463,"context_line":"                    break"},{"line_number":464,"context_line":"            else:"},{"line_number":465,"context_line":"                raise ext_sg.SecurityGroupNotFound(id\u003dsg_id)"},{"line_number":466,"context_line":"        return security_group_ids"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2FyMg%3D","line":466,"updated":"2013-01-05 01:15:28.000000000","message":"I suggest we write it directly by sql statement, which will avoid to get all security groups for a tenant or all tenants if admin:\nport_sgs \u003d p.get(ext_sg.SECURITYGROUP)\nif port_sgs:\n    query1 \u003d query(SecurityGroup.id)\n    query1 \u003d query1.filter(SecurityGroup.id.in_(port_sgs))\n    query2 \u003d query(SecurityGroup.external_id)\n    query2 \u003d query1.filter(SecurityGroup.external_id.in_(port_sgs))\n    sg_ids \u003d query1.union(query2).all()\n    if sgs:\n       return [sg_id[0] for sg_id in sg_ids]\n    else:\n       raise ext_sg.SecurityGroupNotFound(xxxx)","commit_id":"a39d42efde1dce5873ef034e6b6c53ec37aaf69c"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":463,"context_line":"                    break"},{"line_number":464,"context_line":"            else:"},{"line_number":465,"context_line":"                raise ext_sg.SecurityGroupNotFound(id\u003dsg_id)"},{"line_number":466,"context_line":"        return security_group_ids"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2Fx3c%3D","line":466,"in_reply_to":"AAAAM3%2F%2Fx4U%3D","updated":"2013-01-05 09:39:04.000000000","message":"Oh my bad. get_security_groups already does that.","commit_id":"a39d42efde1dce5873ef034e6b6c53ec37aaf69c"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":463,"context_line":"                    break"},{"line_number":464,"context_line":"            else:"},{"line_number":465,"context_line":"                raise ext_sg.SecurityGroupNotFound(id\u003dsg_id)"},{"line_number":466,"context_line":"        return security_group_ids"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2Fx3s%3D","line":466,"in_reply_to":"AAAAM3%2F%2Fx4U%3D","updated":"2013-01-05 10:00:58.000000000","message":"Retrieving the whole list of security groups can be easily avoided either doing a Yong suggests, or passing in filters argument to get_security_groups and calling it twice.\nComputationally, a union query has little difference with two queries.\n\nI don\u0027t think there\u0027s a need for get_security_groups_on_port since you can always pass filters with a port attribute to get_security_groups. Also, in this case we just need the ids of the security group on the port.","commit_id":"a39d42efde1dce5873ef034e6b6c53ec37aaf69c"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":463,"context_line":"                    break"},{"line_number":464,"context_line":"            else:"},{"line_number":465,"context_line":"                raise ext_sg.SecurityGroupNotFound(id\u003dsg_id)"},{"line_number":466,"context_line":"        return security_group_ids"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2Fx4U%3D","line":466,"in_reply_to":"AAAAM3%2F%2FyMg%3D","updated":"2013-01-05 08:13:27.000000000","message":"shouldn\u0027t there be a method called \"get_security_groups\" that return all sg\u0027s of a tenant? and \"get_security_groups_on_port\" should filter the ones in a specific port?","commit_id":"a39d42efde1dce5873ef034e6b6c53ec37aaf69c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":453,"context_line":"        if not attr.is_attr_set(p.get(ext_sg.SECURITYGROUPS)):"},{"line_number":454,"context_line":"            return"},{"line_number":455,"context_line":"        if p.get(\u0027device_owner\u0027) and p[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"},{"line_number":456,"context_line":"            raise ext_sg.SecurityGroupInvalidDeviceOwner()"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        valid_groups \u003d self.get_security_groups("},{"line_number":459,"context_line":"            context, fields\u003d[\u0027external_id\u0027, \u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2FnY0%3D","line":456,"updated":"2013-01-13 11:57:01.000000000","message":"Please check Gary\u0027s patch https://review.openstack.org/#/c/19573/ which takes care of dhcp-agent restart.\n\nWe don\u0027t apply security groups to network ports now, so changing raise to return has no problem. What do you think?","commit_id":"6536b098c6d42a64c6ac4c8ecf430c3abc62a437"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        if not attr.is_attr_set(p.get(ext_sg.SECURITYGROUPS)):"},{"line_number":454,"context_line":"            return"},{"line_number":455,"context_line":"        if p.get(\u0027device_owner\u0027) and p[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"},{"line_number":456,"context_line":"            raise ext_sg.SecurityGroupInvalidDeviceOwner()"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        valid_groups \u003d self.get_security_groups("},{"line_number":459,"context_line":"            context, fields\u003d[\u0027external_id\u0027, \u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2FmME%3D","line":456,"in_reply_to":"AAAAM3%2F%2FnY0%3D","updated":"2013-01-14 17:47:55.000000000","message":"Right, this patch needs rebase. After  it\u0027s rebased it will have the return instead of raise.","commit_id":"6536b098c6d42a64c6ac4c8ecf430c3abc62a437"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":468,"context_line":""},{"line_number":469,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"},{"line_number":470,"context_line":"        if cfg.CONF.SECURITYGROUP.proxy_mode:"},{"line_number":471,"context_line":"            return"},{"line_number":472,"context_line":"        # we don\u0027t apply security groups for dhcp, router"},{"line_number":473,"context_line":"        if (port[\u0027port\u0027].get(\u0027device_owner\u0027) and"},{"line_number":474,"context_line":"                port[\u0027port\u0027][\u0027device_owner\u0027].startswith(\u0027network:\u0027)):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2Fn2Y%3D","line":471,"updated":"2013-01-12 09:14:11.000000000","message":"It would be better there is some comment why we need to skip the logic below when proxy_mode is enabled.\n\nIn my understanding the reason of it is that security_group id is specified by external_id. Is that right?","commit_id":"6536b098c6d42a64c6ac4c8ecf430c3abc62a437"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":468,"context_line":""},{"line_number":469,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"},{"line_number":470,"context_line":"        if cfg.CONF.SECURITYGROUP.proxy_mode:"},{"line_number":471,"context_line":"            return"},{"line_number":472,"context_line":"        # we don\u0027t apply security groups for dhcp, router"},{"line_number":473,"context_line":"        if (port[\u0027port\u0027].get(\u0027device_owner\u0027) and"},{"line_number":474,"context_line":"                port[\u0027port\u0027][\u0027device_owner\u0027].startswith(\u0027network:\u0027)):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2FmLc%3D","line":471,"in_reply_to":"AAAAM3%2F%2Fn2Y%3D","updated":"2013-01-14 17:47:55.000000000","message":"Sure, I\u0027ll add a comment.  If nova is driving quantum\u0027s security group nova will create the default security group and will handle putting the default security group on the port.","commit_id":"6536b098c6d42a64c6ac4c8ecf430c3abc62a437"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":463,"context_line":"                               for g in valid_groups if g.get(\u0027external_id\u0027))"},{"line_number":464,"context_line":"        try:"},{"line_number":465,"context_line":"            return [valid_group_map[sg_id]"},{"line_number":466,"context_line":"                    for sg_id in p.get(ext_sg.SECURITYGROUPS, [])]"},{"line_number":467,"context_line":"        except KeyError, e:"},{"line_number":468,"context_line":"            raise ext_sg.SecurityGroupNotFound(id\u003de.message)"},{"line_number":469,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2Flak%3D","line":466,"updated":"2013-01-15 00:21:53.000000000","message":"strictly speaking, the result will have duplicated sg ids. does it matter?","commit_id":"20c1e554e2f5f9f9f2a64988aa1a1dc66cfef3e6"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":463,"context_line":"                               for g in valid_groups if g.get(\u0027external_id\u0027))"},{"line_number":464,"context_line":"        try:"},{"line_number":465,"context_line":"            return [valid_group_map[sg_id]"},{"line_number":466,"context_line":"                    for sg_id in p.get(ext_sg.SECURITYGROUPS, [])]"},{"line_number":467,"context_line":"        except KeyError, e:"},{"line_number":468,"context_line":"            raise ext_sg.SecurityGroupNotFound(id\u003de.message)"},{"line_number":469,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2FlSM%3D","line":466,"in_reply_to":"AAAAM3%2F%2FlVc%3D","updated":"2013-01-15 01:55:17.000000000","message":"I mean the case we have a port with both external_id and id which is the same security_group.","commit_id":"20c1e554e2f5f9f9f2a64988aa1a1dc66cfef3e6"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":463,"context_line":"                               for g in valid_groups if g.get(\u0027external_id\u0027))"},{"line_number":464,"context_line":"        try:"},{"line_number":465,"context_line":"            return [valid_group_map[sg_id]"},{"line_number":466,"context_line":"                    for sg_id in p.get(ext_sg.SECURITYGROUPS, [])]"},{"line_number":467,"context_line":"        except KeyError, e:"},{"line_number":468,"context_line":"            raise ext_sg.SecurityGroupNotFound(id\u003de.message)"},{"line_number":469,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2FlVc%3D","line":466,"in_reply_to":"AAAAM3%2F%2Flak%3D","updated":"2013-01-15 01:14:49.000000000","message":"You are saying this because the user could pass in the same id multiple times?","commit_id":"20c1e554e2f5f9f9f2a64988aa1a1dc66cfef3e6"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":464,"context_line":"        try:"},{"line_number":465,"context_line":"            return [valid_group_map[sg_id]"},{"line_number":466,"context_line":"                    for sg_id in p.get(ext_sg.SECURITYGROUPS, [])]"},{"line_number":467,"context_line":"        except KeyError, e:"},{"line_number":468,"context_line":"            raise ext_sg.SecurityGroupNotFound(id\u003de.message)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2FliA%3D","line":467,"updated":"2013-01-15 00:21:53.000000000","message":"we should use KeyError as e:","commit_id":"20c1e554e2f5f9f9f2a64988aa1a1dc66cfef3e6"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":464,"context_line":"        try:"},{"line_number":465,"context_line":"            return [valid_group_map[sg_id]"},{"line_number":466,"context_line":"                    for sg_id in p.get(ext_sg.SECURITYGROUPS, [])]"},{"line_number":467,"context_line":"        except KeyError, e:"},{"line_number":468,"context_line":"            raise ext_sg.SecurityGroupNotFound(id\u003de.message)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2FlU4%3D","line":467,"in_reply_to":"AAAAM3%2F%2FliA%3D","updated":"2013-01-15 01:14:49.000000000","message":"Done","commit_id":"20c1e554e2f5f9f9f2a64988aa1a1dc66cfef3e6"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":465,"context_line":"            return [valid_group_map[sg_id]"},{"line_number":466,"context_line":"                    for sg_id in p.get(ext_sg.SECURITYGROUPS, [])]"},{"line_number":467,"context_line":"        except KeyError, e:"},{"line_number":468,"context_line":"            raise ext_sg.SecurityGroupNotFound(id\u003de.message)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"},{"line_number":471,"context_line":"        # we don\u0027t apply security groups for dhcp, router"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2Fla4%3D","line":468,"updated":"2013-01-15 00:21:53.000000000","message":"id\u003dstr(e) or id\u003de is enough.","commit_id":"20c1e554e2f5f9f9f2a64988aa1a1dc66cfef3e6"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":465,"context_line":"            return [valid_group_map[sg_id]"},{"line_number":466,"context_line":"                    for sg_id in p.get(ext_sg.SECURITYGROUPS, [])]"},{"line_number":467,"context_line":"        except KeyError, e:"},{"line_number":468,"context_line":"            raise ext_sg.SecurityGroupNotFound(id\u003de.message)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"},{"line_number":471,"context_line":"        # we don\u0027t apply security groups for dhcp, router"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2FlU0%3D","line":468,"in_reply_to":"AAAAM3%2F%2Fla4%3D","updated":"2013-01-15 01:14:49.000000000","message":"Done","commit_id":"20c1e554e2f5f9f9f2a64988aa1a1dc66cfef3e6"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"},{"line_number":471,"context_line":"        # If proxy_mode is enabled return since nova will handle adding"},{"line_number":472,"context_line":"        # the port to the default security group."},{"line_number":473,"context_line":"        if cfg.CONF.SECURITYGROUP.proxy_mode:"},{"line_number":474,"context_line":"            return"},{"line_number":475,"context_line":"        # we don\u0027t apply security groups for dhcp, router"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAM3%2F%2Fjug%3D","line":472,"updated":"2013-01-16 00:23:29.000000000","message":"# return if proxy_mode is enabled since xxxx","commit_id":"26a50fe7c5bc0cd5fd9d70494cd50f729247c633"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    def _ensure_default_security_group_on_port(self, context, port):"},{"line_number":471,"context_line":"        # If proxy_mode is enabled return since nova will handle adding"},{"line_number":472,"context_line":"        # the port to the default security group."},{"line_number":473,"context_line":"        if cfg.CONF.SECURITYGROUP.proxy_mode:"},{"line_number":474,"context_line":"            return"},{"line_number":475,"context_line":"        # we don\u0027t apply security groups for dhcp, router"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAM3%2F%2FjsE%3D","line":472,"in_reply_to":"AAAAM3%2F%2Fjug%3D","updated":"2013-01-16 00:56:44.000000000","message":"Done","commit_id":"26a50fe7c5bc0cd5fd9d70494cd50f729247c633"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":452,"context_line":"        \"\"\""},{"line_number":453,"context_line":"        p \u003d port[\u0027port\u0027]"},{"line_number":454,"context_line":"        if not attr.is_attr_set(p.get(ext_sg.SECURITYGROUPS)):"},{"line_number":455,"context_line":"            return"},{"line_number":456,"context_line":"        if p.get(\u0027device_owner\u0027) and p[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"},{"line_number":457,"context_line":"            return"},{"line_number":458,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAM3%2F%2Fjnc%3D","line":455,"updated":"2013-01-16 03:04:28.000000000","message":"Returning None is better since this method returns a value.","commit_id":"4569dd820a8adfc1e359ae0f0de2879027827039"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":452,"context_line":"        \"\"\""},{"line_number":453,"context_line":"        p \u003d port[\u0027port\u0027]"},{"line_number":454,"context_line":"        if not attr.is_attr_set(p.get(ext_sg.SECURITYGROUPS)):"},{"line_number":455,"context_line":"            return"},{"line_number":456,"context_line":"        if p.get(\u0027device_owner\u0027) and p[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"},{"line_number":457,"context_line":"            return"},{"line_number":458,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAM3%2F%2Fjhc%3D","line":455,"in_reply_to":"AAAAM3%2F%2Fjlw%3D","updated":"2013-01-16 04:39:31.000000000","message":"Yes, that is correct. The suggestion is just my preference. Personally I prefer to returning None explicitly in such case. There is no need to change. Thanks.","commit_id":"4569dd820a8adfc1e359ae0f0de2879027827039"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":452,"context_line":"        \"\"\""},{"line_number":453,"context_line":"        p \u003d port[\u0027port\u0027]"},{"line_number":454,"context_line":"        if not attr.is_attr_set(p.get(ext_sg.SECURITYGROUPS)):"},{"line_number":455,"context_line":"            return"},{"line_number":456,"context_line":"        if p.get(\u0027device_owner\u0027) and p[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"},{"line_number":457,"context_line":"            return"},{"line_number":458,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAM3%2F%2Fjlw%3D","line":455,"in_reply_to":"AAAAM3%2F%2Fjnc%3D","updated":"2013-01-16 03:25:59.000000000","message":"None is actually returned if it isn\u0027t specified. \n\n[11]: def foo():\n   ....:     return None\n   ....: \n\nIn [12]: print foo()\nNone","commit_id":"4569dd820a8adfc1e359ae0f0de2879027827039"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":454,"context_line":"        if not attr.is_attr_set(p.get(ext_sg.SECURITYGROUPS)):"},{"line_number":455,"context_line":"            return"},{"line_number":456,"context_line":"        if p.get(\u0027device_owner\u0027) and p[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"},{"line_number":457,"context_line":"            return"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"        valid_groups \u003d self.get_security_groups("},{"line_number":460,"context_line":"            context, fields\u003d[\u0027external_id\u0027, \u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAM3%2F%2FjnY%3D","line":457,"updated":"2013-01-16 03:04:28.000000000","message":"Ditto","commit_id":"4569dd820a8adfc1e359ae0f0de2879027827039"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":454,"context_line":"        if not attr.is_attr_set(p.get(ext_sg.SECURITYGROUPS)):"},{"line_number":455,"context_line":"            return"},{"line_number":456,"context_line":"        if p.get(\u0027device_owner\u0027) and p[\u0027device_owner\u0027].startswith(\u0027network:\u0027):"},{"line_number":457,"context_line":"            return"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"        valid_groups \u003d self.get_security_groups("},{"line_number":460,"context_line":"            context, fields\u003d[\u0027external_id\u0027, \u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAM3%2F%2Fjls%3D","line":457,"in_reply_to":"AAAAM3%2F%2FjnY%3D","updated":"2013-01-16 03:25:59.000000000","message":"ditto.","commit_id":"4569dd820a8adfc1e359ae0f0de2879027827039"}],"quantum/extensions/securitygroup.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"unresolved":false,"context_lines":[{"line_number":149,"context_line":"        raise SecurityGroupProxyMode()"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"def convert_to_uuid_or_int(value_list):"},{"line_number":153,"context_line":"    if not attr.is_attr_set(value_list):"},{"line_number":154,"context_line":"        return"},{"line_number":155,"context_line":"    converted_list \u003d []"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2Fn3M%3D","line":152,"updated":"2013-01-12 09:14:11.000000000","message":"This method converts a list but the method name does not describe it. How about changing the method to convert an element of a list and defining another method to convert a list?","commit_id":"6536b098c6d42a64c6ac4c8ecf430c3abc62a437"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        raise SecurityGroupProxyMode()"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"def convert_to_uuid_or_int(value_list):"},{"line_number":153,"context_line":"    if not attr.is_attr_set(value_list):"},{"line_number":154,"context_line":"        return"},{"line_number":155,"context_line":"    converted_list \u003d []"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2FmLY%3D","line":152,"in_reply_to":"AAAAM3%2F%2Fn3M%3D","updated":"2013-01-14 17:47:55.000000000","message":"Done","commit_id":"6536b098c6d42a64c6ac4c8ecf430c3abc62a437"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":127,"context_line":"        raise SecurityGroupInvalidPortValue(port\u003dport)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"def convert_list_to_uuid_or_int(value_list):"},{"line_number":131,"context_line":"    if not attr.is_attr_set(value_list):"},{"line_number":132,"context_line":"        return"},{"line_number":133,"context_line":"    converted_list \u003d []"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2Fk7c%3D","line":130,"updated":"2013-01-15 10:22:16.000000000","message":"convert_list_to_uuid_or_int -\u003e convert_to_uuid_or_int_list?","commit_id":"c20a872691e816383d5bf6786f8991c1e90046fc"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        raise SecurityGroupInvalidPortValue(port\u003dport)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"def convert_list_to_uuid_or_int(value_list):"},{"line_number":131,"context_line":"    if not attr.is_attr_set(value_list):"},{"line_number":132,"context_line":"        return"},{"line_number":133,"context_line":"    converted_list \u003d []"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAM3%2F%2Fkqw%3D","line":130,"in_reply_to":"AAAAM3%2F%2Fk7c%3D","updated":"2013-01-15 16:54:03.000000000","message":"Done","commit_id":"c20a872691e816383d5bf6786f8991c1e90046fc"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":130,"context_line":"def convert_to_uuid_or_int_list(value_list):"},{"line_number":131,"context_line":"    if not attr.is_attr_set(value_list):"},{"line_number":132,"context_line":"        return"},{"line_number":133,"context_line":"    converted_list \u003d []"},{"line_number":134,"context_line":"    for sg_id in value_list:"},{"line_number":135,"context_line":"        if uuidutils.is_uuid_like(sg_id):"},{"line_number":136,"context_line":"            converted_list.append(sg_id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAM3%2F%2FkDY%3D","line":133,"updated":"2013-01-15 21:26:23.000000000","message":"Consider:\ntry:\n   return [sg_id if uuidutils.is_uuid_like(sg_id) else in(sg_id) \n           for sg_id in value_list]\nexcept (ValueError, TypeError):\n    msg \u003d _(\"\u0027%s\u0027 is not an integer or uuid\") % sg_id\n    raise qexception.InvalidInput(error_message\u003dmsg)","commit_id":"81601667f2e6cb9f2e5150d16b644484427798cd"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":130,"context_line":"def convert_to_uuid_or_int_list(value_list):"},{"line_number":131,"context_line":"    if not attr.is_attr_set(value_list):"},{"line_number":132,"context_line":"        return"},{"line_number":133,"context_line":"    converted_list \u003d []"},{"line_number":134,"context_line":"    for sg_id in value_list:"},{"line_number":135,"context_line":"        if uuidutils.is_uuid_like(sg_id):"},{"line_number":136,"context_line":"            converted_list.append(sg_id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAM3%2F%2Fj%2Fg%3D","line":133,"in_reply_to":"AAAAM3%2F%2FkDY%3D","updated":"2013-01-15 21:49:43.000000000","message":"Done","commit_id":"81601667f2e6cb9f2e5150d16b644484427798cd"}],"quantum/tests/unit/test_extension_security_group.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":825,"context_line":"                data \u003d {\u0027port\u0027: {\u0027fixed_ips\u0027: port[\u0027port\u0027][\u0027fixed_ips\u0027],"},{"line_number":826,"context_line":"                                 \u0027name\u0027: port[\u0027port\u0027][\u0027name\u0027],"},{"line_number":827,"context_line":"                                 ext_sg.SECURITYGROUP:"},{"line_number":828,"context_line":"                                 [sg2[\u0027security_group\u0027][\u0027id\u0027],"},{"line_number":829,"context_line":"                                  port[\u0027port\u0027][\u0027security_groups\u0027][0]]}}"},{"line_number":830,"context_line":"                req \u003d self.new_update_request(\u0027ports\u0027, data,"},{"line_number":831,"context_line":"                                              port[\u0027port\u0027][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2Fx3o%3D","line":828,"updated":"2013-01-05 10:00:58.000000000","message":"ddi you meant passing the external id here?","commit_id":"a39d42efde1dce5873ef034e6b6c53ec37aaf69c"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":825,"context_line":"                data \u003d {\u0027port\u0027: {\u0027fixed_ips\u0027: port[\u0027port\u0027][\u0027fixed_ips\u0027],"},{"line_number":826,"context_line":"                                 \u0027name\u0027: port[\u0027port\u0027][\u0027name\u0027],"},{"line_number":827,"context_line":"                                 ext_sg.SECURITYGROUP:"},{"line_number":828,"context_line":"                                 [sg2[\u0027security_group\u0027][\u0027id\u0027],"},{"line_number":829,"context_line":"                                  port[\u0027port\u0027][\u0027security_groups\u0027][0]]}}"},{"line_number":830,"context_line":"                req \u003d self.new_update_request(\u0027ports\u0027, data,"},{"line_number":831,"context_line":"                                              port[\u0027port\u0027][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2FwF0%3D","line":828,"in_reply_to":"AAAAM3%2F%2Fx3o%3D","updated":"2013-01-07 18:15:57.000000000","message":"Since nova uses integers for external_id\u0027s if ext_sg.SECURITYGROUP is an int it is an external id. I revised this patch though to check that a uuid (non-external id is returned. I also added a unit test creating a port with a bad external_id).","commit_id":"a39d42efde1dce5873ef034e6b6c53ec37aaf69c"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":808,"context_line":"        self.assertEqual(res.status_int, 400)"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"    def test_validate_port_external_id_quantum_id(self):"},{"line_number":811,"context_line":"        cfg.CONF.SECURITYGROUP.proxy_mode \u003d True"},{"line_number":812,"context_line":"        with self.network() as n:"},{"line_number":813,"context_line":"            with self.subnet(n):"},{"line_number":814,"context_line":"                sg1 \u003d (self.deserialize(\u0027json\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2FvQk%3D","line":811,"updated":"2013-01-08 04:55:25.000000000","message":"we should be using:\n\ncfg.CONF.set_override(\u0027proxy_mode\u0027, True, \u0027SECURITYGROUP)","commit_id":"6d5603b8c3efa4aef457ec97041cad797ffa7f35"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":808,"context_line":"        self.assertEqual(res.status_int, 400)"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"    def test_validate_port_external_id_quantum_id(self):"},{"line_number":811,"context_line":"        cfg.CONF.SECURITYGROUP.proxy_mode \u003d True"},{"line_number":812,"context_line":"        with self.network() as n:"},{"line_number":813,"context_line":"            with self.subnet(n):"},{"line_number":814,"context_line":"                sg1 \u003d (self.deserialize(\u0027json\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2Fsyc%3D","line":811,"in_reply_to":"AAAAM3%2F%2FvQk%3D","updated":"2013-01-09 07:32:54.000000000","message":"Done","commit_id":"6d5603b8c3efa4aef457ec97041cad797ffa7f35"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":838,"context_line":"                self._delete(\u0027ports\u0027, port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":839,"context_line":""},{"line_number":840,"context_line":"    def test_validate_port_external_id_fail(self):"},{"line_number":841,"context_line":"        cfg.CONF.SECURITYGROUP.proxy_mode \u003d True"},{"line_number":842,"context_line":"        with self.network() as n:"},{"line_number":843,"context_line":"            with self.subnet(n):"},{"line_number":844,"context_line":"                bad_id \u003d 1"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2FvQg%3D","line":841,"updated":"2013-01-08 04:55:25.000000000","message":"cfg.CONF.set_override(\u0027proxy_mode\u0027, True, \u0027SECURITYGROUP)","commit_id":"6d5603b8c3efa4aef457ec97041cad797ffa7f35"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"1ea3ca09f3f27ff1162bc96e76e5b70d91938a4e","unresolved":false,"context_lines":[{"line_number":838,"context_line":"                self._delete(\u0027ports\u0027, port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":839,"context_line":""},{"line_number":840,"context_line":"    def test_validate_port_external_id_fail(self):"},{"line_number":841,"context_line":"        cfg.CONF.SECURITYGROUP.proxy_mode \u003d True"},{"line_number":842,"context_line":"        with self.network() as n:"},{"line_number":843,"context_line":"            with self.subnet(n):"},{"line_number":844,"context_line":"                bad_id \u003d 1"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2FsyY%3D","line":841,"in_reply_to":"AAAAM3%2F%2FvQg%3D","updated":"2013-01-09 07:32:54.000000000","message":"Done","commit_id":"6d5603b8c3efa4aef457ec97041cad797ffa7f35"}]}
