)]}'
{"nova/objects/security_group_rule.py":[{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"a364e7c9c1911f90f07a456010c6b8599f2dc310","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @base.remotable_classmethod"},{"line_number":66,"context_line":"    def get_by_security_group_id(cls, context, secgroup_id):"},{"line_number":67,"context_line":"        db_rules \u003d db.security_group_rule_get_by_security_group("},{"line_number":68,"context_line":"            context, secgroup_id)"},{"line_number":69,"context_line":"        return base.obj_make_list(context, cls(), SecurityGroupRule, db_rules,"},{"line_number":70,"context_line":"                                  expected_attrs\u003d[\u0027grantee_group\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FLng%3D","line":67,"updated":"2013-10-21 20:35:38.000000000","message":"This DB call always joins \u0027instances\u0027...  and in fact, joins instances.system_metadata and instances.info_cache.\n\nSince as a part of converting to objects, we\u0027re forcing instances to be queried separately...  it seems like we should make this NOT join all of that stuff.  That means we\u0027ll need a kwarg on the DB call.","commit_id":"ccd9f9e68992860cc52d8bf6473c6837a518b1fb"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"f29f6069c41944400fe96ad6f93d13478bdefb59","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        if expected_sub_attrs is None:"},{"line_number":43,"context_line":"            expected_sub_attrs \u003d {}"},{"line_number":44,"context_line":"        for field in rule.fields:"},{"line_number":45,"context_line":"            if field in expected_attrs and db_rule[field]:"},{"line_number":46,"context_line":"                rule[field] \u003d security_group.SecurityGroup._from_db_object("},{"line_number":47,"context_line":"                    context, security_group.SecurityGroup(), db_rule[field])"},{"line_number":48,"context_line":"            elif field not in OPTIONAL_ATTRS:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2FzpA%3D","line":45,"updated":"2013-10-28 18:38:39.000000000","message":"if the field can be None, seems like we should store it here even if not db_rule[field]?   We don\u0027t have any obj_load_attr support here, so lazy loading would fail.","commit_id":"8743358927cc44984090e92dc94fb9a95581b88e"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"8b76097cae5477132cae33cf048944d1fcd34dfb","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @staticmethod"},{"line_number":45,"context_line":"    def _from_db_object(context, rule, db_rule, expected_attrs\u003dNone,"},{"line_number":46,"context_line":"                        expected_sub_attrs\u003dNone):"},{"line_number":47,"context_line":"        if expected_attrs is None:"},{"line_number":48,"context_line":"            expected_attrs \u003d []"},{"line_number":49,"context_line":"        if expected_sub_attrs is None:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2FyS0%3D","line":46,"updated":"2013-10-29 04:33:05.000000000","message":"Heh, and I didn\u0027t notice this before.  expected_sub_attrs.  I think this is left over from the \u0027instances\u0027 code.  I\u0027m sure you\u0027re getting tired of rebasing, so I think we can clean this up later.  Shouldn\u0027t affect object versioning.","commit_id":"0bf9495bcf6d51b52546ccb8d3329d6247323cb1"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"0d6a7e8cec42eebd56db3a011612fabfecf0636c","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @staticmethod"},{"line_number":45,"context_line":"    def _from_db_object(context, rule, db_rule, expected_attrs\u003dNone,"},{"line_number":46,"context_line":"                        expected_sub_attrs\u003dNone):"},{"line_number":47,"context_line":"        if expected_attrs is None:"},{"line_number":48,"context_line":"            expected_attrs \u003d []"},{"line_number":49,"context_line":"        if expected_sub_attrs is None:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2FxJ0%3D","line":46,"in_reply_to":"AAAATn%2F%2FyS0%3D","updated":"2013-10-29 11:10:35.000000000","message":"Good catch, I\u0027ve put up I21742e23fbd6477bd3d246d64124bbb571b40f94 to track it","commit_id":"0bf9495bcf6d51b52546ccb8d3329d6247323cb1"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"0d6a7e8cec42eebd56db3a011612fabfecf0636c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            expected_sub_attrs \u003d {}"},{"line_number":51,"context_line":"        for field in rule.fields:"},{"line_number":52,"context_line":"            if field in expected_attrs:"},{"line_number":53,"context_line":"                rule[field] \u003d rule._from_db_subgroup(context, db_rule[field])"},{"line_number":54,"context_line":"            elif field not in OPTIONAL_ATTRS:"},{"line_number":55,"context_line":"                rule[field] \u003d db_rule[field]"},{"line_number":56,"context_line":"        rule._context \u003d context"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2FxKA%3D","line":53,"updated":"2013-10-29 11:10:35.000000000","message":"I feel like there\u0027s a pre-condition we should be enforcing here - e.g. that expected_attrs should be a subset of OPTIONAL_ATTRS ... and maybe that OPTIONAL_ATTRS should be called GROUP_ATTRS or something\n\ni.e. why can we assume expected_attrs only refers to security groups ?","commit_id":"0bf9495bcf6d51b52546ccb8d3329d6247323cb1"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"0d6a7e8cec42eebd56db3a011612fabfecf0636c","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        db_rules \u003d db.security_group_rule_get_by_security_group("},{"line_number":74,"context_line":"            context, secgroup_id, columns_to_join\u003d[\u0027grantee_group\u0027])"},{"line_number":75,"context_line":"        return base.obj_make_list(context, cls(), SecurityGroupRule, db_rules,"},{"line_number":76,"context_line":"                                  expected_attrs\u003d[\u0027grantee_group\u0027])"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @classmethod"},{"line_number":79,"context_line":"    def get_by_security_group(cls, context, security_group):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2FxJo%3D","line":76,"updated":"2013-10-29 11:10:35.000000000","message":"Hmm, why only grantee_group ?","commit_id":"0bf9495bcf6d51b52546ccb8d3329d6247323cb1"}],"nova/tests/objects/test_security_group_rule.py":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"9066f49e2472ccfb5fe73354a25dafa7373573ad","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    \u0027deleted\u0027: False,"},{"line_number":29,"context_line":"    \u0027id\u0027: 1,"},{"line_number":30,"context_line":"    \u0027protocol\u0027: \u0027tcp\u0027,"},{"line_number":31,"context_line":"    \u0027from_port\u0027: None,"},{"line_number":32,"context_line":"    \u0027to_port\u0027: 22,"},{"line_number":33,"context_line":"    \u0027cidr\u0027: \u00270.0.0.0/0\u0027,"},{"line_number":34,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2Fc1w%3D","line":31,"updated":"2013-10-16 00:51:51.000000000","message":"nit: doesn\u0027t matter for your testcase but might as well make this \u003c\u003d to_port. Could also add group_id, cidr etc.","commit_id":"34aa0c3ac2c61f3fa1656451eb6a0308fdc7bf47"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"90579296b0a24705f67146ef00df8f4369275b65","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    \u0027deleted\u0027: False,"},{"line_number":29,"context_line":"    \u0027id\u0027: 1,"},{"line_number":30,"context_line":"    \u0027protocol\u0027: \u0027tcp\u0027,"},{"line_number":31,"context_line":"    \u0027from_port\u0027: None,"},{"line_number":32,"context_line":"    \u0027to_port\u0027: 22,"},{"line_number":33,"context_line":"    \u0027cidr\u0027: \u00270.0.0.0/0\u0027,"},{"line_number":34,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2Fcww%3D","line":31,"in_reply_to":"AAAATH%2F%2Fc1w%3D","updated":"2013-10-16 01:24:49.000000000","message":"Oh, I was thinking about this as \"source port\" but this is actually a port range, between from and to, right? If so, it\u0027s probably worth making this realistic since these templates are used by other code that needs a fake thing to base a test on.","commit_id":"34aa0c3ac2c61f3fa1656451eb6a0308fdc7bf47"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"763e58e0ce42efc27d273320e01edfd1fc6a3160","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    \u0027deleted\u0027: False,"},{"line_number":29,"context_line":"    \u0027id\u0027: 1,"},{"line_number":30,"context_line":"    \u0027protocol\u0027: \u0027tcp\u0027,"},{"line_number":31,"context_line":"    \u0027from_port\u0027: None,"},{"line_number":32,"context_line":"    \u0027to_port\u0027: 22,"},{"line_number":33,"context_line":"    \u0027cidr\u0027: \u00270.0.0.0/0\u0027,"},{"line_number":34,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FcF8%3D","line":31,"in_reply_to":"AAAATH%2F%2Fcww%3D","updated":"2013-10-16 06:27:31.000000000","message":"yup it\u0027s a from to range.","commit_id":"34aa0c3ac2c61f3fa1656451eb6a0308fdc7bf47"}]}
