)]}'
{"neutron/api/rpc/callbacks/resources.py":[{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"793470ca0c29684c990f24dfd4fa780d48189aae","unresolved":false,"context_lines":[{"line_number":25,"context_line":"PORT \u003d ports.Port.obj_name()"},{"line_number":26,"context_line":"NETWORK \u003d network.Network.obj_name()"},{"line_number":27,"context_line":"SECURITYGROUP \u003d securitygroup.SecurityGroup.obj_name()"},{"line_number":28,"context_line":"SECURITYGROUPRULE \u003d securitygroup.SecurityGroupRule.obj_name()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"_VALID_CLS \u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_7fff5101","line":28,"updated":"2016-11-08 09:36:50.000000000","message":"hi kevin,i have a question for security group, we can push the security groups and security group rules to l2 agents, but how does the l2 agent get the security groups members?for example, we have a security group rules with remote_security_group, the l2 agent need to get the remote_security_group members to generate the iptables rule or open flows.","commit_id":"7b5f7825dd04ad26c927923a724b9a0becf33c05"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"e34b546ddaea7f5b3aa0ffedaebbf66cbd384b46","unresolved":false,"context_lines":[{"line_number":25,"context_line":"PORT \u003d ports.Port.obj_name()"},{"line_number":26,"context_line":"NETWORK \u003d network.Network.obj_name()"},{"line_number":27,"context_line":"SECURITYGROUP \u003d securitygroup.SecurityGroup.obj_name()"},{"line_number":28,"context_line":"SECURITYGROUPRULE \u003d securitygroup.SecurityGroupRule.obj_name()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"_VALID_CLS \u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_dfbd94d8","line":28,"in_reply_to":"9a629dbe_7fff5101","updated":"2016-11-08 23:35:08.000000000","message":"The l2 agent will have to calculate it by looking at it\u0027s own store of all of the ports.","commit_id":"7b5f7825dd04ad26c927923a724b9a0becf33c05"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1a25a4072b9483d64c107c3a975cb53e54a8e48d","unresolved":false,"context_lines":[{"line_number":25,"context_line":"PORT \u003d ports.Port.obj_name()"},{"line_number":26,"context_line":"NETWORK \u003d network.Network.obj_name()"},{"line_number":27,"context_line":"SECURITYGROUP \u003d securitygroup.SecurityGroup.obj_name()"},{"line_number":28,"context_line":"SECURITYGROUPRULE \u003d securitygroup.SecurityGroupRule.obj_name()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"_VALID_CLS \u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_c2b3cae7","line":28,"in_reply_to":"9a629dbe_81890229","updated":"2016-11-09 23:25:46.000000000","message":"We can just start out storing all ports and refine it down as necessary. We should be able to scale to scale to 100k ports without using 1G of memory even without dropping unnecessary ports from memory.","commit_id":"7b5f7825dd04ad26c927923a724b9a0becf33c05"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"b0c7416c5fb7bda5fbfd2ec451f108275b6f0f00","unresolved":false,"context_lines":[{"line_number":25,"context_line":"PORT \u003d ports.Port.obj_name()"},{"line_number":26,"context_line":"NETWORK \u003d network.Network.obj_name()"},{"line_number":27,"context_line":"SECURITYGROUP \u003d securitygroup.SecurityGroup.obj_name()"},{"line_number":28,"context_line":"SECURITYGROUPRULE \u003d securitygroup.SecurityGroupRule.obj_name()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"_VALID_CLS \u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_8054f7ca","line":28,"in_reply_to":"9a629dbe_c2b3cae7","updated":"2016-11-14 02:09:46.000000000","message":"got it, maybe we can store ports based on project","commit_id":"7b5f7825dd04ad26c927923a724b9a0becf33c05"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"49f6a4b43973e23004019b2a5beb3834c16b4547","unresolved":false,"context_lines":[{"line_number":25,"context_line":"PORT \u003d ports.Port.obj_name()"},{"line_number":26,"context_line":"NETWORK \u003d network.Network.obj_name()"},{"line_number":27,"context_line":"SECURITYGROUP \u003d securitygroup.SecurityGroup.obj_name()"},{"line_number":28,"context_line":"SECURITYGROUPRULE \u003d securitygroup.SecurityGroupRule.obj_name()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"_VALID_CLS \u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_81890229","line":28,"in_reply_to":"9a629dbe_dfbd94d8","updated":"2016-11-09 01:47:31.000000000","message":"do you mean the l2 agent will store all of ports or just related ports to this l2 agent, if it store all, it will consume much memory in large scale, if it just store related ports, how does it know which port is related. hope your reply, thx","commit_id":"7b5f7825dd04ad26c927923a724b9a0becf33c05"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"7410c9b6a9a1ba889624586108a1a263b0f96273","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    securitygroup.SecurityGroup,"},{"line_number":39,"context_line":"    securitygroup.SecurityGroupRule,"},{"line_number":40,"context_line":")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"_TYPE_TO_CLS_MAP \u003d {cls.obj_name(): cls for cls in _VALID_CLS}"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"LOCAL_RESOURCE_VERSIONS \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_85511cdb","line":41,"updated":"2016-11-08 18:43:43.000000000","message":"oh yikes, I should retake the dynamic registration of this, and changing all the above 21-28 to string literals to avoid excessive dependencies crawling out from this module.","commit_id":"7b5f7825dd04ad26c927923a724b9a0becf33c05"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"e34b546ddaea7f5b3aa0ffedaebbf66cbd384b46","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    securitygroup.SecurityGroup,"},{"line_number":39,"context_line":"    securitygroup.SecurityGroupRule,"},{"line_number":40,"context_line":")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"_TYPE_TO_CLS_MAP \u003d {cls.obj_name(): cls for cls in _VALID_CLS}"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"LOCAL_RESOURCE_VERSIONS \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_5fe34405","line":41,"in_reply_to":"9a629dbe_85511cdb","updated":"2016-11-08 23:35:08.000000000","message":"Yeah, I think dynamic registration for both would actually be something nice to have.\n\nRather than things checking module-level vars, maybe they can call a function in this module that looks in a dynamically loaded map...","commit_id":"7b5f7825dd04ad26c927923a724b9a0becf33c05"}],"neutron/plugins/ml2/ovo_rpc.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"7410c9b6a9a1ba889624586108a1a263b0f96273","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            rpc_event \u003d rpc_events.DELETED"},{"line_number":53,"context_line":"            # construct a fake object with the right ID so we can"},{"line_number":54,"context_line":"            # have a payload for the delete message."},{"line_number":55,"context_line":"            # FIXME(kevinbenton): Is this the best way to do this?"},{"line_number":56,"context_line":"            obj \u003d self._obj_class(id\u003dresource_id)"},{"line_number":57,"context_line":"        else:"},{"line_number":58,"context_line":"            rpc_event \u003d rpc_events.UPDATED"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_a58f0022","line":55,"updated":"2016-11-08 18:43:43.000000000","message":"what else can we do if there\u0027s no object to grab?","commit_id":"7b5f7825dd04ad26c927923a724b9a0becf33c05"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"e34b546ddaea7f5b3aa0ffedaebbf66cbd384b46","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            rpc_event \u003d rpc_events.DELETED"},{"line_number":53,"context_line":"            # construct a fake object with the right ID so we can"},{"line_number":54,"context_line":"            # have a payload for the delete message."},{"line_number":55,"context_line":"            # FIXME(kevinbenton): Is this the best way to do this?"},{"line_number":56,"context_line":"            obj \u003d self._obj_class(id\u003dresource_id)"},{"line_number":57,"context_line":"        else:"},{"line_number":58,"context_line":"            rpc_event \u003d rpc_events.UPDATED"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_1f2aac2c","line":55,"in_reply_to":"9a629dbe_a58f0022","updated":"2016-11-08 23:35:08.000000000","message":"I was thinking maybe a different message format to notify of deleted objects. It seems a little overkill to build a fake object just to be able to tell the agent that an object is deleted.","commit_id":"7b5f7825dd04ad26c927923a724b9a0becf33c05"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"33ce18a7df09ec524238fd9337b596340825e6e9","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        resource_id \u003d self._extract_resource_id(kwargs)"},{"line_number":71,"context_line":"        # attempt to get regardless of event type so concurrent delete"},{"line_number":72,"context_line":"        # after create/update is the same code-path as a delete event"},{"line_number":73,"context_line":"        with db_api.context_manager.independent.reader.using(context):"},{"line_number":74,"context_line":"            obj \u003d self._obj_class.get_object(context, id\u003dresource_id)"},{"line_number":75,"context_line":"        # CREATE events are always treated as UPDATE events to ensure"},{"line_number":76,"context_line":"        # listeners are written to handle out-of-order messages"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a57fde8_8f107650","line":73,"updated":"2017-01-12 18:03:31.000000000","message":"get_object uses the same session that is passed into it. By using the independent context here, it ensures that it won\u0027t read from any objects sitting in a session that may actually be stale.","commit_id":"bd16782879cb4abbb648797906152cf650eb7294"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"fb77d3c7ad99686feb2d3aee1862f6d2b50a1494","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        resource_id \u003d self._extract_resource_id(kwargs)"},{"line_number":71,"context_line":"        # attempt to get regardless of event type so concurrent delete"},{"line_number":72,"context_line":"        # after create/update is the same code-path as a delete event"},{"line_number":73,"context_line":"        with db_api.context_manager.independent.reader.using(context):"},{"line_number":74,"context_line":"            obj \u003d self._obj_class.get_object(context, id\u003dresource_id)"},{"line_number":75,"context_line":"        # CREATE events are always treated as UPDATE events to ensure"},{"line_number":76,"context_line":"        # listeners are written to handle out-of-order messages"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a57fde8_8acb1172","line":73,"updated":"2017-01-12 14:54:54.000000000","message":"nit: get_object already gives you a (sub)transaction","commit_id":"bd16782879cb4abbb648797906152cf650eb7294"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"c11808caf7e4c68f92fd18f8426c4b40e5c4c68c","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            return callback_kwargs[id_kwarg]"},{"line_number":92,"context_line":"        if self._resource in callback_kwargs:"},{"line_number":93,"context_line":"            return callback_kwargs[self._resource][\u0027id\u0027]"},{"line_number":94,"context_line":"        raise RuntimeError(\"Couldn\u0027t find resource ID in callback event\")"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class OVOServerRpcInterface(object):"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a3c09a3_5daae71a","line":94,"updated":"2017-01-12 22:55:03.000000000","message":"no need to i18n this one?","commit_id":"bd16782879cb4abbb648797906152cf650eb7294"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"320e9223b442ad430950f5dcbd57bd4c098c30a3","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            return callback_kwargs[id_kwarg]"},{"line_number":92,"context_line":"        if self._resource in callback_kwargs:"},{"line_number":93,"context_line":"            return callback_kwargs[self._resource][\u0027id\u0027]"},{"line_number":94,"context_line":"        raise RuntimeError(\"Couldn\u0027t find resource ID in callback event\")"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class OVOServerRpcInterface(object):"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a3c09a3_2326b1ba","line":94,"in_reply_to":"7a3c09a3_5daae71a","updated":"2017-01-13 17:00:34.000000000","message":"Arguably, it\u0027s directed towards developers and hence doesn\u0027t need i18n.","commit_id":"bd16782879cb4abbb648797906152cf650eb7294"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"af30f7319049e0205c49512149a3a7bc984cbd6a","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        with db_api.context_manager.independent.reader.using(context):"},{"line_number":74,"context_line":"            obj \u003d self._obj_class.get_object(context, id\u003dresource_id)"},{"line_number":75,"context_line":"        # CREATE events are always treated as UPDATE events to ensure"},{"line_number":76,"context_line":"        # listeners are written to handle out-of-order messages"},{"line_number":77,"context_line":"        if obj is None:"},{"line_number":78,"context_line":"            rpc_event \u003d rpc_events.DELETED"},{"line_number":79,"context_line":"            # construct a fake object with the right ID so we can"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a3905b3_f3ed6d8f","line":76,"updated":"2017-01-19 13:46:25.000000000","message":"Just curious, can you elaborate  (here in gerrit comments) ^ ?  :-)\notherwise I\u0027ll ping you on IRC.\n\nTBH the semantic difference between CREATE and UPDATE should make no different to agents.","commit_id":"d394569daf2c2cf5a58dd77483eb2d4dccc17264"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"e5d0ba5c9c718ad537548f4af955c15dc9210c05","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        with db_api.context_manager.independent.reader.using(context):"},{"line_number":74,"context_line":"            obj \u003d self._obj_class.get_object(context, id\u003dresource_id)"},{"line_number":75,"context_line":"        # CREATE events are always treated as UPDATE events to ensure"},{"line_number":76,"context_line":"        # listeners are written to handle out-of-order messages"},{"line_number":77,"context_line":"        if obj is None:"},{"line_number":78,"context_line":"            rpc_event \u003d rpc_events.DELETED"},{"line_number":79,"context_line":"            # construct a fake object with the right ID so we can"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a3905b3_940a38d1","line":76,"in_reply_to":"5a3905b3_f3ed6d8f","updated":"2017-01-19 20:49:55.000000000","message":"Right. I don\u0027t want people to write agents that expect a CREATE event and do something different than when they receive an UPDATE event, because the CREATE may have get lost or the agent may have been offline. \n\nTreating them all as updates forces the receivers to treat them equally.","commit_id":"d394569daf2c2cf5a58dd77483eb2d4dccc17264"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"85838312b62218dbb5aed1bd0b9a2fb880d1b693","unresolved":false,"context_lines":[{"line_number":1247,"context_line":""},{"line_number":1248,"context_line":"        # NOTE(kevinbenton): triggered outside of transaction since it"},{"line_number":1249,"context_line":"        # emits \u0027AFTER\u0027 events if it creates."},{"line_number":1250,"context_line":"        self._ensure_default_security_group(context, attrs[\u0027tenant_id\u0027])"},{"line_number":1251,"context_line":"        session \u003d context.session"},{"line_number":1252,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":1253,"context_line":"            dhcp_opts \u003d attrs.get(edo_ext.EXTRADHCPOPTS, [])"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_ac69e027","line":1250,"updated":"2016-11-30 02:27:48.000000000","message":"why here also need to check default security group?","commit_id":"ee6f321a58f21d172ab774d017096b6c8e05f346"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"cc0567d5b3fd4ad3daaebdaf928204a705123f46","unresolved":false,"context_lines":[{"line_number":1247,"context_line":""},{"line_number":1248,"context_line":"        # NOTE(kevinbenton): triggered outside of transaction since it"},{"line_number":1249,"context_line":"        # emits \u0027AFTER\u0027 events if it creates."},{"line_number":1250,"context_line":"        self._ensure_default_security_group(context, attrs[\u0027tenant_id\u0027])"},{"line_number":1251,"context_line":"        session \u003d context.session"},{"line_number":1252,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":1253,"context_line":"            dhcp_opts \u003d attrs.get(edo_ext.EXTRADHCPOPTS, [])"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a71b18c_b74cec9e","line":1250,"in_reply_to":"3a71b18c_8918e6d4","updated":"2016-12-07 09:02:03.000000000","message":"got it, thx for your explanation.","commit_id":"ee6f321a58f21d172ab774d017096b6c8e05f346"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"94b2f6222b80337a23b5ed7ac6069bfa84ddeeb3","unresolved":false,"context_lines":[{"line_number":1247,"context_line":""},{"line_number":1248,"context_line":"        # NOTE(kevinbenton): triggered outside of transaction since it"},{"line_number":1249,"context_line":"        # emits \u0027AFTER\u0027 events if it creates."},{"line_number":1250,"context_line":"        self._ensure_default_security_group(context, attrs[\u0027tenant_id\u0027])"},{"line_number":1251,"context_line":"        session \u003d context.session"},{"line_number":1252,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":1253,"context_line":"            dhcp_opts \u003d attrs.get(edo_ext.EXTRADHCPOPTS, [])"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a71b18c_8918e6d4","line":1250,"in_reply_to":"5a74a57a_ac69e027","updated":"2016-12-06 11:56:44.000000000","message":"A default group gets created if one doesn\u0027t exist when a port is created. We need to make sure that happens outside of a transaction.","commit_id":"ee6f321a58f21d172ab774d017096b6c8e05f346"}],"neutron/tests/unit/plugins/ml2/test_ovo_rpc.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"fb77d3c7ad99686feb2d3aee1862f6d2b50a1494","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def _assert_object_received(self, ovotype, oid\u003dNone, event\u003dNone):"},{"line_number":36,"context_line":"        for obj, evt in self.received:"},{"line_number":37,"context_line":"            if isinstance(obj, ovotype):"},{"line_number":38,"context_line":"                if (obj.id \u003d\u003d oid or not oid) and (not event or event \u003d\u003d evt):"},{"line_number":39,"context_line":"                    return obj"},{"line_number":40,"context_line":"        self.fail(\"Could not find OVO %s with ID %s in %s\" %"},{"line_number":41,"context_line":"                  (ovotype, oid, self.received))"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a57fde8_55f9cac7","line":38,"range":{"start_line":38,"start_character":30,"end_line":38,"end_character":44},"updated":"2017-01-12 14:54:54.000000000","message":"I didn\u0027t know you are into poetry.","commit_id":"bd16782879cb4abbb648797906152cf650eb7294"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"33ce18a7df09ec524238fd9337b596340825e6e9","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def _assert_object_received(self, ovotype, oid\u003dNone, event\u003dNone):"},{"line_number":36,"context_line":"        for obj, evt in self.received:"},{"line_number":37,"context_line":"            if isinstance(obj, ovotype):"},{"line_number":38,"context_line":"                if (obj.id \u003d\u003d oid or not oid) and (not event or event \u003d\u003d evt):"},{"line_number":39,"context_line":"                    return obj"},{"line_number":40,"context_line":"        self.fail(\"Could not find OVO %s with ID %s in %s\" %"},{"line_number":41,"context_line":"                  (ovotype, oid, self.received))"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a57fde8_2f094a2d","line":38,"updated":"2017-01-12 18:03:31.000000000","message":"I wrote it just for you :)","commit_id":"bd16782879cb4abbb648797906152cf650eb7294"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"fb77d3c7ad99686feb2d3aee1862f6d2b50a1494","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def _assert_object_received(self, ovotype, oid\u003dNone, event\u003dNone):"},{"line_number":36,"context_line":"        for obj, evt in self.received:"},{"line_number":37,"context_line":"            if isinstance(obj, ovotype):"},{"line_number":38,"context_line":"                if (obj.id \u003d\u003d oid or not oid) and (not event or event \u003d\u003d evt):"},{"line_number":39,"context_line":"                    return obj"},{"line_number":40,"context_line":"        self.fail(\"Could not find OVO %s with ID %s in %s\" %"},{"line_number":41,"context_line":"                  (ovotype, oid, self.received))"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a57fde8_f5939e4d","line":38,"range":{"start_line":38,"start_character":19,"end_line":38,"end_character":77},"updated":"2017-01-12 14:54:54.000000000","message":"Oh, antimetabole, I like it.","commit_id":"bd16782879cb4abbb648797906152cf650eb7294"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"33ce18a7df09ec524238fd9337b596340825e6e9","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        with self.network() as n:"},{"line_number":45,"context_line":"            self._assert_object_received(network.Network,"},{"line_number":46,"context_line":"                                         n[\u0027network\u0027][\u0027id\u0027],"},{"line_number":47,"context_line":"                                         \u0027updated\u0027)"},{"line_number":48,"context_line":"            self.plugin.delete_network(self.ctx, n[\u0027network\u0027][\u0027id\u0027])"},{"line_number":49,"context_line":"            self._assert_object_received(network.Network,"},{"line_number":50,"context_line":"                                         n[\u0027network\u0027][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a57fde8_4f0e8e35","line":47,"updated":"2017-01-12 18:03:31.000000000","message":"Ack","commit_id":"bd16782879cb4abbb648797906152cf650eb7294"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"fb77d3c7ad99686feb2d3aee1862f6d2b50a1494","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        with self.network() as n:"},{"line_number":45,"context_line":"            self._assert_object_received(network.Network,"},{"line_number":46,"context_line":"                                         n[\u0027network\u0027][\u0027id\u0027],"},{"line_number":47,"context_line":"                                         \u0027updated\u0027)"},{"line_number":48,"context_line":"            self.plugin.delete_network(self.ctx, n[\u0027network\u0027][\u0027id\u0027])"},{"line_number":49,"context_line":"            self._assert_object_received(network.Network,"},{"line_number":50,"context_line":"                                         n[\u0027network\u0027][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a57fde8_95e5f2a9","line":47,"range":{"start_line":47,"start_character":41,"end_line":47,"end_character":50},"updated":"2017-01-12 14:54:54.000000000","message":"consider using constants from neutron/api/rpc/callbacks/events.py","commit_id":"bd16782879cb4abbb648797906152cf650eb7294"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"fb77d3c7ad99686feb2d3aee1862f6d2b50a1494","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            self.plugin.delete_security_group_rule(self.ctx, sgr[\u0027id\u0027])"},{"line_number":82,"context_line":"            self._assert_object_received("},{"line_number":83,"context_line":"                securitygroup.SecurityGroupRule, sgr[\u0027id\u0027], \u0027deleted\u0027)"},{"line_number":84,"context_line":"            self.plugin.delete_security_group(self.ctx, sg.id)"},{"line_number":85,"context_line":"            self._assert_object_received(securitygroup.SecurityGroup, sg.id,"},{"line_number":86,"context_line":"                                         \u0027deleted\u0027)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9a57fde8_d55f7a73","line":84,"updated":"2017-01-12 14:54:54.000000000","message":"If we would call delete_sg without delete_sg_rule, then we would not get the delete event for the rule, right? Is it a problem?","commit_id":"bd16782879cb4abbb648797906152cf650eb7294"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"33ce18a7df09ec524238fd9337b596340825e6e9","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            self.plugin.delete_security_group_rule(self.ctx, sgr[\u0027id\u0027])"},{"line_number":82,"context_line":"            self._assert_object_received("},{"line_number":83,"context_line":"                securitygroup.SecurityGroupRule, sgr[\u0027id\u0027], \u0027deleted\u0027)"},{"line_number":84,"context_line":"            self.plugin.delete_security_group(self.ctx, sg.id)"},{"line_number":85,"context_line":"            self._assert_object_received(securitygroup.SecurityGroup, sg.id,"},{"line_number":86,"context_line":"                                         \u0027deleted\u0027)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9a57fde8_6f13525d","line":84,"updated":"2017-01-12 18:03:31.000000000","message":"We will just have to be careful agent-side to watch for the parent SG of rules being deleted. To simplify things on the agent I think I\u0027m only going to expose broad \u0027security group updated\u0027 type operations that just do a full refresh of the SG.","commit_id":"bd16782879cb4abbb648797906152cf650eb7294"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"5f1b2448dadfd57cf5e4cdf97a790c23be5846c9","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            self.plugin.delete_security_group_rule(self.ctx, sgr[\u0027id\u0027])"},{"line_number":82,"context_line":"            self._assert_object_received("},{"line_number":83,"context_line":"                securitygroup.SecurityGroupRule, sgr[\u0027id\u0027], \u0027deleted\u0027)"},{"line_number":84,"context_line":"            self.plugin.delete_security_group(self.ctx, sg.id)"},{"line_number":85,"context_line":"            self._assert_object_received(securitygroup.SecurityGroup, sg.id,"},{"line_number":86,"context_line":"                                         \u0027deleted\u0027)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7a3c09a3_ddafb77b","line":84,"in_reply_to":"9a57fde8_6f13525d","updated":"2017-01-12 22:49:57.000000000","message":"We could also build a parent-child relationship system (some pieces of it are already tracked in foreign_keys dict of objects) that could be used to issue OVO notifications for all parents if need be.","commit_id":"bd16782879cb4abbb648797906152cf650eb7294"}]}
