)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"8c20c4430741f7a84b75fa824147b4be42313e3b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add unique contraints for security groups"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- Add uniqie contraint (project_id, name, deleted)"},{"line_number":10,"context_line":"  for security_groups"},{"line_number":11,"context_line":"- Define new SecurityGroupExists exception"},{"line_number":12,"context_line":"- Drop security_group_exists() in favor of catching"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAPX%2F%2Fpdw%3D","line":9,"updated":"2013-06-13 14:51:10.000000000","message":"s/uniqie/unique/","commit_id":"bca80364a10cc356ca799e8d6511f502cf5dcb50"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"68d1ee298b961865af59cde77eacd57f5204d9ed","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add unique contraints for security groups"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- Add uniqie contraint (project_id, name, deleted)"},{"line_number":10,"context_line":"  for security_groups"},{"line_number":11,"context_line":"- Define new SecurityGroupExists exception"},{"line_number":12,"context_line":"- Drop security_group_exists() in favor of catching"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAPX%2F%2Fpco%3D","line":9,"in_reply_to":"AAAAPX%2F%2Fpdw%3D","updated":"2013-06-13 14:56:22.000000000","message":"Done","commit_id":"bca80364a10cc356ca799e8d6511f502cf5dcb50"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"7a6605047e0f58dcce31eb673337afd1686029ee","unresolved":false,"context_lines":[{"line_number":13,"context_line":"  SecurityGroupExists exception for security_group_create()"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Blueprint: db-enforce-unique-keys"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: Id9a1427587cc9250942d0abd9eafc69861352d9b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAAPn%2F%2FoGc%3D","line":16,"updated":"2013-06-26 13:49:55.000000000","message":"It also fixes bug https://bugs.launchpad.net/nova/+bug/1093458","commit_id":"30f319ea6317649cf78a81b397f821b6e0ccdede"}],"nova/api/openstack/compute/contrib/security_groups.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"01be010187857145ad6f9ee202800accb0a2aa2c","unresolved":false,"context_lines":[{"line_number":311,"context_line":"            self.security_group_api.validate_property(group_name, \u0027name\u0027, None)"},{"line_number":312,"context_line":"            self.security_group_api.validate_property(group_description,"},{"line_number":313,"context_line":"                                                      \u0027description\u0027, None)"},{"line_number":314,"context_line":"            try:"},{"line_number":315,"context_line":"                group_ref \u003d self.security_group_api.create_security_group("},{"line_number":316,"context_line":"                    context, group_name, group_description)"},{"line_number":317,"context_line":"            except exception.SecurityGroupExists as exp:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2FanE%3D","line":314,"updated":"2013-07-02 13:23:23.000000000","message":"Could you use the translate exceptions mecanism here ?","commit_id":"4a4c36c7c8f52d0c7269b89581b7ebbf2c2f7ea5"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"df40863fa750cdaeab79d8965cb599cd4c895324","unresolved":false,"context_lines":[{"line_number":311,"context_line":"            self.security_group_api.validate_property(group_name, \u0027name\u0027, None)"},{"line_number":312,"context_line":"            self.security_group_api.validate_property(group_description,"},{"line_number":313,"context_line":"                                                      \u0027description\u0027, None)"},{"line_number":314,"context_line":"            try:"},{"line_number":315,"context_line":"                group_ref \u003d self.security_group_api.create_security_group("},{"line_number":316,"context_line":"                    context, group_name, group_description)"},{"line_number":317,"context_line":"            except exception.SecurityGroupExists as exp:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2FaZk%3D","line":314,"in_reply_to":"AAAAPn%2F%2FanE%3D","updated":"2013-07-02 14:07:51.000000000","message":"Done","commit_id":"4a4c36c7c8f52d0c7269b89581b7ebbf2c2f7ea5"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"ba9fd82b460fbd029194e64b8fb841af23f89992","unresolved":false,"context_lines":[{"line_number":311,"context_line":"            self.security_group_api.validate_property(group_name, \u0027name\u0027, None)"},{"line_number":312,"context_line":"            self.security_group_api.validate_property(group_description,"},{"line_number":313,"context_line":"                                                      \u0027description\u0027, None)"},{"line_number":314,"context_line":"            try:"},{"line_number":315,"context_line":"                group_ref \u003d self.security_group_api.create_security_group("},{"line_number":316,"context_line":"                    context, group_name, group_description)"},{"line_number":317,"context_line":"            except exception.SecurityGroupExists as exp:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2Fah4%3D","line":314,"in_reply_to":"AAAAPn%2F%2FanE%3D","updated":"2013-07-02 13:33:05.000000000","message":"good catch","commit_id":"4a4c36c7c8f52d0c7269b89581b7ebbf2c2f7ea5"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"36b90b9ab6923b099898e06d2fb08f791ce5e537","unresolved":false,"context_lines":[{"line_number":3218,"context_line":"    except db_exc.DBDuplicateEntry:"},{"line_number":3219,"context_line":"        raise exception.SecurityGroupExists("},{"line_number":3220,"context_line":"                project_id\u003dvalues.get(\u0027project_id\u0027, None),"},{"line_number":3221,"context_line":"                security_group_name\u003dvalues.get(\u0027name\u0027, None))"},{"line_number":3222,"context_line":"    return security_group_ref"},{"line_number":3223,"context_line":""},{"line_number":3224,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPn%2F%2FbsE%3D","line":3221,"updated":"2013-07-02 02:47:42.000000000","message":"Wouldn\u0027t both of these have to exist in order to get this exception?  Ie, is there any point in not just doing values[\u0027project_id\u0027], etc?   Also, if they don\u0027t exist, you\u0027d have an interesting exception message... containing the strings \u0027None\u0027.  Not really a huge problem, but it kinda bugs me. :)","commit_id":"619d3cde86d6aa0ea691bac556e9f0f8cbcb3fb2"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"791a00a225ba36e7f7a5b56f676f90344a40cef4","unresolved":false,"context_lines":[{"line_number":3218,"context_line":"    except db_exc.DBDuplicateEntry:"},{"line_number":3219,"context_line":"        raise exception.SecurityGroupExists("},{"line_number":3220,"context_line":"                project_id\u003dvalues.get(\u0027project_id\u0027, None),"},{"line_number":3221,"context_line":"                security_group_name\u003dvalues.get(\u0027name\u0027, None))"},{"line_number":3222,"context_line":"    return security_group_ref"},{"line_number":3223,"context_line":""},{"line_number":3224,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPn%2F%2Fa5M%3D","line":3221,"in_reply_to":"AAAAPn%2F%2FbsE%3D","updated":"2013-07-02 11:17:41.000000000","message":"Chris, you\u0027re right, there\u0027s no point to use .get() in this case, thanks.","commit_id":"619d3cde86d6aa0ea691bac556e9f0f8cbcb3fb2"}],"nova/db/sqlalchemy/migrate_repo/versions/189_add_security_group_uc.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7c1d10a751d03dd99407093fd381dd604311fde2","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from nova.db.sqlalchemy import utils"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"UC_NAME \u003d \"uniq_name_x_project_id_x_deleted\""},{"line_number":25,"context_line":"COLUMNS \u003d (\u0027project_id\u0027, \u0027name\u0027, \u0027deleted\u0027)"},{"line_number":26,"context_line":"TABLE_NAME \u003d \u0027security_groups\u0027"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPX%2F%2FpqE%3D","line":24,"updated":"2013-06-13 13:41:00.000000000","message":"Should the naming on this match the pattern in migrate script 185? Look at this change: https://review.openstack.org/#/c/30108/","commit_id":"7d4190310b6a985f00241eedd3f53ca2751b5b0e"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"65b0f5f2ba2543b15b4dc999cd71cd924c14d0de","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from nova.db.sqlalchemy import utils"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"UC_NAME \u003d \"uniq_name_x_project_id_x_deleted\""},{"line_number":25,"context_line":"COLUMNS \u003d (\u0027project_id\u0027, \u0027name\u0027, \u0027deleted\u0027)"},{"line_number":26,"context_line":"TABLE_NAME \u003d \u0027security_groups\u0027"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2FpkM%3D","line":24,"updated":"2013-06-13 14:23:22.000000000","message":"wrong UC name. Please use template \"uniq_t0c10c20c3\" where `0` it is delimiter, `t` it is table name and columns `c1`, `c2`, `c3` are in UniqueConstraint.","commit_id":"bca80364a10cc356ca799e8d6511f502cf5dcb50"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"68d1ee298b961865af59cde77eacd57f5204d9ed","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from nova.db.sqlalchemy import utils"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"UC_NAME \u003d \"uniq_name_x_project_id_x_deleted\""},{"line_number":25,"context_line":"COLUMNS \u003d (\u0027project_id\u0027, \u0027name\u0027, \u0027deleted\u0027)"},{"line_number":26,"context_line":"TABLE_NAME \u003d \u0027security_groups\u0027"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2Fpcg%3D","line":24,"in_reply_to":"AAAAPX%2F%2FpkM%3D","updated":"2013-06-13 14:56:22.000000000","message":"Done","commit_id":"bca80364a10cc356ca799e8d6511f502cf5dcb50"}],"nova/tests/db/test_db_api.py":[{"author":{"_account_id":6681,"name":"Brent Eagles","email":"beagles@redhat.com","username":"beagles"},"change_message_id":"65fb5c9e6b8de11aa7aa59c3c625aa33befe094e","unresolved":false,"context_lines":[{"line_number":1772,"context_line":"        self.assertEquals(1, len(security_groups))"},{"line_number":1773,"context_line":"        self.assertEquals(\"default\", security_groups[0][\"name\"])"},{"line_number":1774,"context_line":""},{"line_number":1775,"context_line":"    def test_security_group_update_to_duplicate(self):"},{"line_number":1776,"context_line":"        security_group1 \u003d self._create_security_group("},{"line_number":1777,"context_line":"                {\u0027name\u0027: \u0027fake1\u0027, \u0027project_id\u0027: \u0027fake_proj1\u0027})"},{"line_number":1778,"context_line":"        security_group2 \u003d self._create_security_group("}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPn%2F%2FiMM%3D","line":1775,"updated":"2013-06-28 10:52:47.000000000","message":"I\u0027m a little confused by this test. It appears that an update call is being made to a security group that was created in a different project. Wouldn\u0027t that result in a SecurityGroupNotFound exception and not a SecurityGroupExists exception?","commit_id":"a9248b4165c4aaeaccd0604a656151111df88d74"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"fa0cadc8fa3a372c7f768abb64fa4c7e1fc40a3b","unresolved":false,"context_lines":[{"line_number":1772,"context_line":"        self.assertEquals(1, len(security_groups))"},{"line_number":1773,"context_line":"        self.assertEquals(\"default\", security_groups[0][\"name\"])"},{"line_number":1774,"context_line":""},{"line_number":1775,"context_line":"    def test_security_group_update_to_duplicate(self):"},{"line_number":1776,"context_line":"        security_group1 \u003d self._create_security_group("},{"line_number":1777,"context_line":"                {\u0027name\u0027: \u0027fake1\u0027, \u0027project_id\u0027: \u0027fake_proj1\u0027})"},{"line_number":1778,"context_line":"        security_group2 \u003d self._create_security_group("}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPn%2F%2FiLw%3D","line":1775,"in_reply_to":"AAAAPn%2F%2FiMM%3D","updated":"2013-06-28 10:55:44.000000000","message":"db.security_group_update() method don\u0027t check anything. It just update secuirty_group record in DB. And this test checks that we are not able to update to existing record.","commit_id":"a9248b4165c4aaeaccd0604a656151111df88d74"}]}
