)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"15664d136a78c565776637625c99a27ad5862df6","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     tanlin \u003clin.tan@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-01-02 17:28:10 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Replace SecurityGroup related tradiditonal API with Object Model"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"1.Replace Nova Compute API to use SecurityGroup Object"},{"line_number":10,"context_line":"2.Keep Neutron_driver API unchanged and return SecurityGroup as a Dict"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAAT3%2F%2FrZE%3D","line":7,"updated":"2014-01-03 16:41:51.000000000","message":"\"traditional\" is misspelled here.","commit_id":"0a78298a02ed43a03c84a3d4fe8d57948099ae26"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"15664d136a78c565776637625c99a27ad5862df6","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"1.Replace Nova Compute API to use SecurityGroup Object"},{"line_number":10,"context_line":"2.Keep Neutron_driver API unchanged and return SecurityGroup as a Dict"},{"line_number":11,"context_line":"3.EC2 API and OpenStack API behavior depends on which SecuityGroup they manipulates"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Implements: blueprint icehouse-objects"},{"line_number":14,"context_line":"Related to blueprint icehouse-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAAT3%2F%2FrY8%3D","line":11,"updated":"2014-01-03 16:41:51.000000000","message":"Line wrap here.\n\n#3 is not clear to me. It\u0027s a statement of a problem (I guess) but not a statement of what is being changed.","commit_id":"0a78298a02ed43a03c84a3d4fe8d57948099ae26"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"15664d136a78c565776637625c99a27ad5862df6","unresolved":false,"context_lines":[{"line_number":10,"context_line":"2.Keep Neutron_driver API unchanged and return SecurityGroup as a Dict"},{"line_number":11,"context_line":"3.EC2 API and OpenStack API behavior depends on which SecuityGroup they manipulates"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Implements: blueprint icehouse-objects"},{"line_number":14,"context_line":"Related to blueprint icehouse-objects"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I4cc1869eb17c2e1019c8ccd4cf5a58426041ecf1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAAT3%2F%2FrYw%3D","line":13,"updated":"2014-01-03 16:41:51.000000000","message":"This is redundant with the line below and also not correct.","commit_id":"0a78298a02ed43a03c84a3d4fe8d57948099ae26"}],"nova/api/ec2/cloud.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ce49d18edf9152cb9d6b0f840173bfb78bae9e94","unresolved":false,"context_lines":[{"line_number":504,"context_line":"            rules \u003d ruleslist.get_by_security_group(context, group)"},{"line_number":505,"context_line":"        else:"},{"line_number":506,"context_line":"            rules \u003d group[\u0027rules\u0027]"},{"line_number":507,"context_line":"        for rule in rules:"},{"line_number":508,"context_line":"            r \u003d {}"},{"line_number":509,"context_line":"            r[\u0027groups\u0027] \u003d []"},{"line_number":510,"context_line":"            r[\u0027ipRanges\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9gyA%3D","line":507,"updated":"2013-12-10 18:49:50.000000000","message":"Instead of adding this handling of both cases, could you just fix whatever other callers are still passing old group dictionaries to this method first?","commit_id":"c5212e9c88cd0bf0770905715e0c6abc72c3b574"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"554ff8b093e69e4daabab9fdd591dd516daa97e1","unresolved":false,"context_lines":[{"line_number":491,"context_line":"        g[\u0027groupName\u0027] \u003d group[\u0027name\u0027]"},{"line_number":492,"context_line":"        g[\u0027ownerId\u0027] \u003d group[\u0027project_id\u0027]"},{"line_number":493,"context_line":"        g[\u0027ipPermissions\u0027] \u003d []"},{"line_number":494,"context_line":"        if self.security_group_api.id_is_uuid:"},{"line_number":495,"context_line":"            rules \u003d group[\u0027rules\u0027]"},{"line_number":496,"context_line":"        else:"},{"line_number":497,"context_line":"            rules \u003d (security_group_rule_obj.SecurityGroupRuleList."}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F97rU%3D","line":494,"updated":"2014-01-31 22:39:25.000000000","message":"I think this deserves a comment explaining why \"group_api.id_is_uuid\" means that we can reference the group\u0027s rules directly.","commit_id":"fa0fe13bcbe157d54f47432fcac0b2f2b6c04cd2"},{"author":{"_account_id":9407,"name":"tan0","email":"tano.tum@gmail.com","username":"tanlin"},"change_message_id":"62a53e8966e8246b53ebc57a0e6df77e2f202ba9","unresolved":false,"context_lines":[{"line_number":491,"context_line":"        g[\u0027groupName\u0027] \u003d group[\u0027name\u0027]"},{"line_number":492,"context_line":"        g[\u0027ownerId\u0027] \u003d group[\u0027project_id\u0027]"},{"line_number":493,"context_line":"        g[\u0027ipPermissions\u0027] \u003d []"},{"line_number":494,"context_line":"        if self.security_group_api.id_is_uuid:"},{"line_number":495,"context_line":"            rules \u003d group[\u0027rules\u0027]"},{"line_number":496,"context_line":"        else:"},{"line_number":497,"context_line":"            rules \u003d (security_group_rule_obj.SecurityGroupRuleList."}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2F32s%3D","line":494,"in_reply_to":"AAAAUH%2F97rU%3D","updated":"2014-02-19 10:30:55.000000000","message":"Done","commit_id":"fa0fe13bcbe157d54f47432fcac0b2f2b6c04cd2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"554ff8b093e69e4daabab9fdd591dd516daa97e1","unresolved":false,"context_lines":[{"line_number":492,"context_line":"        g[\u0027ownerId\u0027] \u003d group[\u0027project_id\u0027]"},{"line_number":493,"context_line":"        g[\u0027ipPermissions\u0027] \u003d []"},{"line_number":494,"context_line":"        if self.security_group_api.id_is_uuid:"},{"line_number":495,"context_line":"            rules \u003d group[\u0027rules\u0027]"},{"line_number":496,"context_line":"        else:"},{"line_number":497,"context_line":"            rules \u003d (security_group_rule_obj.SecurityGroupRuleList."},{"line_number":498,"context_line":"            get_by_security_group(context, group))"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F97rQ%3D","line":495,"updated":"2014-01-31 22:39:25.000000000","message":"Should be attribute syntax.","commit_id":"fa0fe13bcbe157d54f47432fcac0b2f2b6c04cd2"},{"author":{"_account_id":9407,"name":"tan0","email":"tano.tum@gmail.com","username":"tanlin"},"change_message_id":"62a53e8966e8246b53ebc57a0e6df77e2f202ba9","unresolved":false,"context_lines":[{"line_number":492,"context_line":"        g[\u0027ownerId\u0027] \u003d group[\u0027project_id\u0027]"},{"line_number":493,"context_line":"        g[\u0027ipPermissions\u0027] \u003d []"},{"line_number":494,"context_line":"        if self.security_group_api.id_is_uuid:"},{"line_number":495,"context_line":"            rules \u003d group[\u0027rules\u0027]"},{"line_number":496,"context_line":"        else:"},{"line_number":497,"context_line":"            rules \u003d (security_group_rule_obj.SecurityGroupRuleList."},{"line_number":498,"context_line":"            get_by_security_group(context, group))"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2F32M%3D","line":495,"in_reply_to":"AAAAUH%2F97rQ%3D","updated":"2014-02-19 10:30:55.000000000","message":"group is still dict here, it cannot use group.rules","commit_id":"fa0fe13bcbe157d54f47432fcac0b2f2b6c04cd2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"554ff8b093e69e4daabab9fdd591dd516daa97e1","unresolved":false,"context_lines":[{"line_number":495,"context_line":"            rules \u003d group[\u0027rules\u0027]"},{"line_number":496,"context_line":"        else:"},{"line_number":497,"context_line":"            rules \u003d (security_group_rule_obj.SecurityGroupRuleList."},{"line_number":498,"context_line":"            get_by_security_group(context, group))"},{"line_number":499,"context_line":"        for rule in rules:"},{"line_number":500,"context_line":"            r \u003d {}"},{"line_number":501,"context_line":"            r[\u0027groups\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F97rs%3D","line":498,"updated":"2014-01-31 22:39:25.000000000","message":"Indentation of the second line here is very wrong.","commit_id":"fa0fe13bcbe157d54f47432fcac0b2f2b6c04cd2"},{"author":{"_account_id":9407,"name":"tan0","email":"tano.tum@gmail.com","username":"tanlin"},"change_message_id":"62a53e8966e8246b53ebc57a0e6df77e2f202ba9","unresolved":false,"context_lines":[{"line_number":495,"context_line":"            rules \u003d group[\u0027rules\u0027]"},{"line_number":496,"context_line":"        else:"},{"line_number":497,"context_line":"            rules \u003d (security_group_rule_obj.SecurityGroupRuleList."},{"line_number":498,"context_line":"            get_by_security_group(context, group))"},{"line_number":499,"context_line":"        for rule in rules:"},{"line_number":500,"context_line":"            r \u003d {}"},{"line_number":501,"context_line":"            r[\u0027groups\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2F32I%3D","line":498,"in_reply_to":"AAAAUH%2F97rs%3D","updated":"2014-02-19 10:30:55.000000000","message":"Done","commit_id":"fa0fe13bcbe157d54f47432fcac0b2f2b6c04cd2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"554ff8b093e69e4daabab9fdd591dd516daa97e1","unresolved":false,"context_lines":[{"line_number":500,"context_line":"            r \u003d {}"},{"line_number":501,"context_line":"            r[\u0027groups\u0027] \u003d []"},{"line_number":502,"context_line":"            r[\u0027ipRanges\u0027] \u003d []"},{"line_number":503,"context_line":"            if (self.security_group_api.id_is_uuid and rule[\u0027group_id\u0027] or"},{"line_number":504,"context_line":"                (not self.security_group_api.id_is_uuid and"},{"line_number":505,"context_line":"                rule.get(\u0027grantee_group\u0027, None))):"},{"line_number":506,"context_line":"                if self.security_group_api.id_is_uuid:"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F97rI%3D","line":503,"updated":"2014-01-31 22:39:25.000000000","message":"attribute syntax here","commit_id":"fa0fe13bcbe157d54f47432fcac0b2f2b6c04cd2"},{"author":{"_account_id":9407,"name":"tan0","email":"tano.tum@gmail.com","username":"tanlin"},"change_message_id":"62a53e8966e8246b53ebc57a0e6df77e2f202ba9","unresolved":false,"context_lines":[{"line_number":500,"context_line":"            r \u003d {}"},{"line_number":501,"context_line":"            r[\u0027groups\u0027] \u003d []"},{"line_number":502,"context_line":"            r[\u0027ipRanges\u0027] \u003d []"},{"line_number":503,"context_line":"            if (self.security_group_api.id_is_uuid and rule[\u0027group_id\u0027] or"},{"line_number":504,"context_line":"                (not self.security_group_api.id_is_uuid and"},{"line_number":505,"context_line":"                rule.get(\u0027grantee_group\u0027, None))):"},{"line_number":506,"context_line":"                if self.security_group_api.id_is_uuid:"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2F31g%3D","line":503,"in_reply_to":"AAAAUH%2F97rI%3D","updated":"2014-02-19 10:30:55.000000000","message":"rules can be dict or object, so it cannot use attribute syntax here.","commit_id":"fa0fe13bcbe157d54f47432fcac0b2f2b6c04cd2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"554ff8b093e69e4daabab9fdd591dd516daa97e1","unresolved":false,"context_lines":[{"line_number":502,"context_line":"            r[\u0027ipRanges\u0027] \u003d []"},{"line_number":503,"context_line":"            if (self.security_group_api.id_is_uuid and rule[\u0027group_id\u0027] or"},{"line_number":504,"context_line":"                (not self.security_group_api.id_is_uuid and"},{"line_number":505,"context_line":"                rule.get(\u0027grantee_group\u0027, None))):"},{"line_number":506,"context_line":"                if self.security_group_api.id_is_uuid:"},{"line_number":507,"context_line":"                    source_group \u003d self.security_group_api.get("},{"line_number":508,"context_line":"                        context, id\u003drule[\u0027group_id\u0027])"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F97q8%3D","line":505,"updated":"2014-01-31 22:39:25.000000000","message":"The indentation on this line is not correct. Also, you should use the object method obj_attr_is_set() to do this test.","commit_id":"fa0fe13bcbe157d54f47432fcac0b2f2b6c04cd2"},{"author":{"_account_id":9407,"name":"tan0","email":"tano.tum@gmail.com","username":"tanlin"},"change_message_id":"62a53e8966e8246b53ebc57a0e6df77e2f202ba9","unresolved":false,"context_lines":[{"line_number":502,"context_line":"            r[\u0027ipRanges\u0027] \u003d []"},{"line_number":503,"context_line":"            if (self.security_group_api.id_is_uuid and rule[\u0027group_id\u0027] or"},{"line_number":504,"context_line":"                (not self.security_group_api.id_is_uuid and"},{"line_number":505,"context_line":"                rule.get(\u0027grantee_group\u0027, None))):"},{"line_number":506,"context_line":"                if self.security_group_api.id_is_uuid:"},{"line_number":507,"context_line":"                    source_group \u003d self.security_group_api.get("},{"line_number":508,"context_line":"                        context, id\u003drule[\u0027group_id\u0027])"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2F31E%3D","line":505,"in_reply_to":"AAAAUH%2F97q8%3D","updated":"2014-02-19 10:30:55.000000000","message":"In this case, rule object is default to set (\u0027grantee_group\u0027, None) and obj_attr_is_set() is true, which is wrong.","commit_id":"fa0fe13bcbe157d54f47432fcac0b2f2b6c04cd2"},{"author":{"_account_id":9407,"name":"tan0","email":"tano.tum@gmail.com","username":"tanlin"},"change_message_id":"62a53e8966e8246b53ebc57a0e6df77e2f202ba9","unresolved":false,"context_lines":[{"line_number":585,"context_line":"            groups_args_split.append(mykwargs)"},{"line_number":586,"context_line":"        return groups_args_split"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def _rule_obj_last_step(self, context, to_port\u003dNone, from_port\u003dNone,"},{"line_number":589,"context_line":"                                  ip_protocol\u003dNone, cidr_ip\u003dNone, user_id\u003dNone,"},{"line_number":590,"context_line":"                                  source_security_group_name\u003dNone,"},{"line_number":591,"context_line":"                                  source_security_group_owner_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2F3qA%3D","line":588,"updated":"2014-02-19 10:30:55.000000000","message":"I try to do this at beginning but failed. I convert all rules into objects. The problem is neutron\u0027s SecurityGroup. If we transform them into group and rule objects, then they will lost the relationship, because they are not stored in Nova DB.","commit_id":"fa0fe13bcbe157d54f47432fcac0b2f2b6c04cd2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"554ff8b093e69e4daabab9fdd591dd516daa97e1","unresolved":false,"context_lines":[{"line_number":585,"context_line":"            groups_args_split.append(mykwargs)"},{"line_number":586,"context_line":"        return groups_args_split"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def _rule_obj_last_step(self, context, to_port\u003dNone, from_port\u003dNone,"},{"line_number":589,"context_line":"                                  ip_protocol\u003dNone, cidr_ip\u003dNone, user_id\u003dNone,"},{"line_number":590,"context_line":"                                  source_security_group_name\u003dNone,"},{"line_number":591,"context_line":"                                  source_security_group_owner_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F97qo%3D","line":588,"updated":"2014-01-31 22:39:25.000000000","message":"Why not just convert all the uses in this file so you don\u0027t need the conditionals everywhere and this extra helper function?","commit_id":"fa0fe13bcbe157d54f47432fcac0b2f2b6c04cd2"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"c1b59ca1f812030b401765ad907a78d21c6596d5","unresolved":false,"context_lines":[{"line_number":485,"context_line":""},{"line_number":486,"context_line":"    def _format_security_group(self, context, group):"},{"line_number":487,"context_line":"        g \u003d {}"},{"line_number":488,"context_line":"        rules \u003d []"},{"line_number":489,"context_line":"        g[\u0027groupDescription\u0027] \u003d group[\u0027description\u0027]"},{"line_number":490,"context_line":"        g[\u0027groupName\u0027] \u003d group[\u0027name\u0027]"},{"line_number":491,"context_line":"        g[\u0027ownerId\u0027] \u003d group[\u0027project_id\u0027]"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAU3%2F%2Fc4U%3D","line":488,"updated":"2014-02-26 15:51:12.000000000","message":"minor nit, but perhaps move this line down to where rules is initialized and keep the g initialization together.","commit_id":"23887afc74b19529ea2d3ada45557562bfa63c34"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"c1b59ca1f812030b401765ad907a78d21c6596d5","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        g[\u0027groupName\u0027] \u003d group[\u0027name\u0027]"},{"line_number":491,"context_line":"        g[\u0027ownerId\u0027] \u003d group[\u0027project_id\u0027]"},{"line_number":492,"context_line":"        g[\u0027ipPermissions\u0027] \u003d []"},{"line_number":493,"context_line":"        if self.security_group_api.id_is_uuid:"},{"line_number":494,"context_line":"            # Note (lintan): Becuase Neutron SecurityGroup use uuid and return"},{"line_number":495,"context_line":"            # as a Dict. So API can reference the group\u0027s rules directly"},{"line_number":496,"context_line":"            rules \u003d group[\u0027rules\u0027]"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAU3%2F%2Fcfs%3D","line":493,"updated":"2014-02-26 15:51:12.000000000","message":"are there explicit tests to verify both sides of these \"id_is_uuid\" if-statements all over the code? Kinda hard to find where this is addressed.","commit_id":"23887afc74b19529ea2d3ada45557562bfa63c34"}],"nova/api/openstack/compute/contrib/security_groups.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1adf52ef583c4abb070ba181de16aed8f4197477","unresolved":false,"context_lines":[{"line_number":233,"context_line":"        security_group[\u0027name\u0027] \u003d group[\u0027name\u0027]"},{"line_number":234,"context_line":"        security_group[\u0027tenant_id\u0027] \u003d group[\u0027project_id\u0027]"},{"line_number":235,"context_line":"        if isinstance(group, security_group_obj.SecurityGroup):"},{"line_number":236,"context_line":"            security_group[\u0027user_id\u0027] \u003d group[\u0027user_id\u0027]"},{"line_number":237,"context_line":"            security_group[\u0027created_at\u0027] \u003d group[\u0027created_at\u0027]"},{"line_number":238,"context_line":"            security_group[\u0027updated_at\u0027] \u003d group[\u0027updated_at\u0027]"},{"line_number":239,"context_line":"            security_group[\u0027deleted_at\u0027] \u003d group[\u0027deleted_at\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BAgU%3D","line":236,"updated":"2013-12-03 15:07:47.000000000","message":"These should use attributes instead of items. I..e instead of:\n\n group[\u0027user_id\u0027]\n\nuse\n\n group.user_id","commit_id":"e0d2796f545f4123da4d0d6aac3cd0ba2ce3a384"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1adf52ef583c4abb070ba181de16aed8f4197477","unresolved":false,"context_lines":[{"line_number":242,"context_line":"            security_group[\u0027rules\u0027] \u003d []"},{"line_number":243,"context_line":"            for rule in group[\u0027rules\u0027]:"},{"line_number":244,"context_line":"                security_group[\u0027rules\u0027] +\u003d [self._format_security_group_rule("},{"line_number":245,"context_line":"                        context, rule)]"},{"line_number":246,"context_line":"        return security_group"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def _from_body(self, body, key):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BAfo%3D","line":245,"updated":"2013-12-03 15:07:47.000000000","message":"I think we should try to avoid things like this and just make sure that everything that calls this function uses objects. Is there some reason not to?","commit_id":"e0d2796f545f4123da4d0d6aac3cd0ba2ce3a384"},{"author":{"_account_id":9407,"name":"tan0","email":"tano.tum@gmail.com","username":"tanlin"},"change_message_id":"77cb85ab6f0939fa9fe85eb8f80e5ce5df82d7c5","unresolved":false,"context_lines":[{"line_number":242,"context_line":"            security_group[\u0027rules\u0027] \u003d []"},{"line_number":243,"context_line":"            for rule in group[\u0027rules\u0027]:"},{"line_number":244,"context_line":"                security_group[\u0027rules\u0027] +\u003d [self._format_security_group_rule("},{"line_number":245,"context_line":"                        context, rule)]"},{"line_number":246,"context_line":"        return security_group"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def _from_body(self, body, key):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9888%3D","line":245,"in_reply_to":"AAAATn%2F%2BAfo%3D","updated":"2013-12-04 03:14:03.000000000","message":"I am not quite sure should we return object instead of a dict?\nYou mean do something like this?\ndef _format_security_group_obj(self, context, group):\n        security_group \u003d security_group_obj.SecurityGroup()\n        security_group.id \u003d group.id\n        security_group.description \u003d group.description\n        security_group.name \u003d group.name \n        security_group.project_id  \u003d group.project_id\n        security_group.user_id \u003d group.user_id\n        return security_group\n\nMy doubt is in next comment around class ServerSecurityGroupController.index","commit_id":"e0d2796f545f4123da4d0d6aac3cd0ba2ce3a384"},{"author":{"_account_id":9407,"name":"tan0","email":"tano.tum@gmail.com","username":"tanlin"},"change_message_id":"77cb85ab6f0939fa9fe85eb8f80e5ce5df82d7c5","unresolved":false,"context_lines":[{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        result \u003d [self._format_security_group(context, group)"},{"line_number":445,"context_line":"                    for group in groups]"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        return {\u0027security_groups\u0027:"},{"line_number":448,"context_line":"                list(sorted(result,"},{"line_number":449,"context_line":"                            key\u003dlambda k: (k[\u0027tenant_id\u0027], k[\u0027name\u0027])))}"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F988k%3D","line":446,"updated":"2013-12-04 03:14:03.000000000","message":"If we use _format_security_group_obj and return object, then we will return something like this:\n{\u0027security_groups\u0027: [\n\u003cnova.objects.security_group.SecurityGroup object at 0x4f40f50\u003e, \n\u003cnova.objects.security_group.SecurityGroup object at 0x4cf33d0\u003e]}\n\nI guess what we need is \n{\u0027security_groups\u0027: [{\u0027created_at\u0027: None,\n                      \u0027deleted\u0027: False,\n                      \u0027deleted_at\u0027: None,\n                      \u0027description\u0027: \u0027default-desc\u0027,\n                      \u0027id\u0027: 1,\n                      \u0027name\u0027: \u0027default\u0027,\n                      \u0027project_id\u0027: \u0027123\u0027,\n                      \u0027updated_at\u0027: None,\n                      \u0027user_id\u0027: \u0027fake-user\u0027},\n                     {\u0027created_at\u0027: None,\n                      \u0027deleted\u0027: False,\n                      \u0027deleted_at\u0027: None,\n                      \u0027description\u0027: \u0027test-desc\u0027,\n                      \u0027id\u0027: 2,\n                      \u0027name\u0027: \u0027test\u0027,\n                      \u0027project_id\u0027: \u0027123\u0027,\n                      \u0027updated_at\u0027: None,\n                      \u0027user_id\u0027: \u0027fake-user\u0027}]}\nSo that means in _format_security_group_obj, we just need to return a dict instead of object.","commit_id":"e0d2796f545f4123da4d0d6aac3cd0ba2ce3a384"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ce49d18edf9152cb9d6b0f840173bfb78bae9e94","unresolved":false,"context_lines":[{"line_number":235,"context_line":"        security_group[\u0027description\u0027] \u003d group[\u0027description\u0027]"},{"line_number":236,"context_line":"        security_group[\u0027name\u0027] \u003d group[\u0027name\u0027]"},{"line_number":237,"context_line":"        security_group[\u0027tenant_id\u0027] \u003d group[\u0027project_id\u0027]"},{"line_number":238,"context_line":"        #(lintan)Neutron\u0027s security_group will transofom to be nova\u0027s"},{"line_number":239,"context_line":"        #security_group and call this function. But because the id of Neutron\u0027s"},{"line_number":240,"context_line":"        #security_group is uuid, it can not be transform, wchich means it can"},{"line_number":241,"context_line":"        #only pass as dict, so we need a condition here"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9gx4%3D","line":238,"updated":"2013-12-10 18:49:50.000000000","message":"This is not proper NOTE() format, and \"transform\" is misspelled.","commit_id":"c5212e9c88cd0bf0770905715e0c6abc72c3b574"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ce49d18edf9152cb9d6b0f840173bfb78bae9e94","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        security_group[\u0027tenant_id\u0027] \u003d group[\u0027project_id\u0027]"},{"line_number":238,"context_line":"        #(lintan)Neutron\u0027s security_group will transofom to be nova\u0027s"},{"line_number":239,"context_line":"        #security_group and call this function. But because the id of Neutron\u0027s"},{"line_number":240,"context_line":"        #security_group is uuid, it can not be transform, wchich means it can"},{"line_number":241,"context_line":"        #only pass as dict, so we need a condition here"},{"line_number":242,"context_line":"        if isinstance(group, security_group_obj.SecurityGroup):"},{"line_number":243,"context_line":"            ruleslist \u003d security_group_rule_obj.SecurityGroupRuleList()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9gxk%3D","line":240,"updated":"2013-12-10 18:49:50.000000000","message":"\"which\" is misspelled.","commit_id":"c5212e9c88cd0bf0770905715e0c6abc72c3b574"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ce49d18edf9152cb9d6b0f840173bfb78bae9e94","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        #(lintan)Neutron\u0027s security_group will transofom to be nova\u0027s"},{"line_number":239,"context_line":"        #security_group and call this function. But because the id of Neutron\u0027s"},{"line_number":240,"context_line":"        #security_group is uuid, it can not be transform, wchich means it can"},{"line_number":241,"context_line":"        #only pass as dict, so we need a condition here"},{"line_number":242,"context_line":"        if isinstance(group, security_group_obj.SecurityGroup):"},{"line_number":243,"context_line":"            ruleslist \u003d security_group_rule_obj.SecurityGroupRuleList()"},{"line_number":244,"context_line":"            rules \u003d ruleslist.get_by_security_group(context, group)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9gxY%3D","line":241,"updated":"2013-12-10 18:49:50.000000000","message":"Please put a space between the # and the first character of these comment lines.","commit_id":"c5212e9c88cd0bf0770905715e0c6abc72c3b574"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ce49d18edf9152cb9d6b0f840173bfb78bae9e94","unresolved":false,"context_lines":[{"line_number":244,"context_line":"            rules \u003d ruleslist.get_by_security_group(context, group)"},{"line_number":245,"context_line":"        else:"},{"line_number":246,"context_line":"            rules \u003d group[\u0027rules\u0027]"},{"line_number":247,"context_line":"        for rule in rules:"},{"line_number":248,"context_line":"            security_group[\u0027rules\u0027] +\u003d [self._format_security_group_rule("},{"line_number":249,"context_line":"                    context, rule)]"},{"line_number":250,"context_line":"        return security_group"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9gxI%3D","line":247,"updated":"2013-12-10 18:49:50.000000000","message":"Couldn\u0027t we just make Neutron\u0027s security_group API return proper objects first so we don\u0027t have to add this conditional handling?","commit_id":"c5212e9c88cd0bf0770905715e0c6abc72c3b574"}],"nova/compute/api.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1adf52ef583c4abb070ba181de16aed8f4197477","unresolved":false,"context_lines":[{"line_number":3732,"context_line":"                                     detailed\u003dFalse):          "},{"line_number":3733,"context_line":"        instance \u003d instance_obj.Instance.get_by_uuid(context, instance_uuid)"},{"line_number":3734,"context_line":"        security_groups \u003d instance[\u0027security_groups\u0027]"},{"line_number":3735,"context_line":"        security_groups \u003d security_groups.get_by_instance(context, instance)"},{"line_number":3736,"context_line":"        if detailed:"},{"line_number":3737,"context_line":"            return security_groups"},{"line_number":3738,"context_line":"        return [{\u0027name\u0027: group[\u0027name\u0027]} for group in security_groups]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BAe0%3D","line":3735,"updated":"2013-12-03 15:07:47.000000000","message":"This introduces an additional (expensive) lookup. Just construct the instance with the uuid and pass it to the query:\n\n instance \u003d instance_obj.Instance(uuid\u003dinstance_uuid)\n security_groups \u003d security_group_obj.get_by_instance(context, instance)\n\nAlso note that you\u0027re overwriting a module with a variable in your code.","commit_id":"e0d2796f545f4123da4d0d6aac3cd0ba2ce3a384"}],"nova/tests/api/openstack/compute/contrib/test_security_groups.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ce49d18edf9152cb9d6b0f840173bfb78bae9e94","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def security_group_obj_sample(security_group):"},{"line_number":96,"context_line":"    #Keep consistent with api output"},{"line_number":97,"context_line":"    attrs \u003d security_group.copy()"},{"line_number":98,"context_line":"    if \u0027created_at\u0027 in attrs:"},{"line_number":99,"context_line":"        attrs.pop(\u0027created_at\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9gxA%3D","line":96,"updated":"2013-12-10 18:49:50.000000000","message":"Need a space after # here","commit_id":"c5212e9c88cd0bf0770905715e0c6abc72c3b574"}]}
