)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"6d2ed73891f6929977f8037d06b3e640fb962753","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Omer Anson \u003comer.anson@toganetworks.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-01-23 10:55:28 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"An instance update also sends an update on all referred instances"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When an instance is updated/created in the DF local controller, the DF local"},{"line_number":10,"context_line":"controller now iterates all references within the instance, and sends an"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"7f96bb07_6b597833","line":7,"range":{"start_line":7,"start_character":3,"end_line":7,"end_character":11},"updated":"2018-04-11 10:36:35.000000000","message":"instance of what?","commit_id":"e26cff0da156c8f3511bfd7a5279144a39af428a"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"6d2ed73891f6929977f8037d06b3e640fb962753","unresolved":false,"context_lines":[{"line_number":9,"context_line":"When an instance is updated/created in the DF local controller, the DF local"},{"line_number":10,"context_line":"controller now iterates all references within the instance, and sends an"},{"line_number":11,"context_line":"update/create event for all instances referenced by that instance."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Related-Bug: #1690775"},{"line_number":14,"context_line":"Related-Bug: #1708178"},{"line_number":15,"context_line":"Change-Id: Ic2ee535c0898b37c200719381f61c954b9ff7ddf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bf659307_3a7cef81","line":12,"updated":"2018-04-11 10:36:35.000000000","message":"Can you please add some example","commit_id":"15edeea94094235e1ad6e96672739a7600535e00"}],"dragonflow/controller/df_local_controller.py":[{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"dd8cd104e80bb99aed72dc08e2d8787d2ffb2e01","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            if item.id in seen:"},{"line_number":344,"context_line":"                continue"},{"line_number":345,"context_line":"            seen.add(item.id)"},{"line_number":346,"context_line":"            db_item \u003d self.nb_api.get(item)"},{"line_number":347,"context_line":"            if model_proxy.is_model_proxy(item):"},{"line_number":348,"context_line":"                yield db_item"},{"line_number":349,"context_line":"            for submodel in db_item.iter_submodels():"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f436f4f_02a20a9b","line":346,"range":{"start_line":346,"start_character":12,"end_line":346,"end_character":43},"updated":"2017-08-21 14:15:08.000000000","message":"I\u0027m concerned that we\u0027re generating much more db traffic here","commit_id":"b1c3b96b5cea011efa32a75fac1e9f67a8278016"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"a6f2ea441b9bdd4d745d84b303c0fb9fe9dec9ab","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            if item.id in seen:"},{"line_number":344,"context_line":"                continue"},{"line_number":345,"context_line":"            seen.add(item.id)"},{"line_number":346,"context_line":"            db_item \u003d self.nb_api.get(item)"},{"line_number":347,"context_line":"            if model_proxy.is_model_proxy(item):"},{"line_number":348,"context_line":"                yield db_item"},{"line_number":349,"context_line":"            for submodel in db_item.iter_submodels():"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f436f4f_1714784d","line":346,"range":{"start_line":346,"start_character":12,"end_line":346,"end_character":43},"in_reply_to":"9f436f4f_02a20a9b","updated":"2018-01-22 14:34:04.000000000","message":"Let\u0027s see the rally results and take it from there.","commit_id":"b1c3b96b5cea011efa32a75fac1e9f67a8278016"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"1e0f419d61477294a600f814d3717dfb08414e2b","unresolved":false,"context_lines":[{"line_number":332,"context_line":"        else:"},{"line_number":333,"context_line":"            LOG.warning(\u0027Unfamiliar update: %s\u0027, str(update))"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def iter_model_references_deep(self, obj):"},{"line_number":336,"context_line":"        seen \u003d set()"},{"line_number":337,"context_line":"        queue \u003d collections.deque((obj,))"},{"line_number":338,"context_line":"        while queue:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f96bb07_19b71589","line":335,"updated":"2018-01-22 11:00:10.000000000","message":"maybe move also to model-framework ?","commit_id":"2d818280b7e191892dfaf36465b9fff1e1902261"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"a6f2ea441b9bdd4d745d84b303c0fb9fe9dec9ab","unresolved":false,"context_lines":[{"line_number":332,"context_line":"        else:"},{"line_number":333,"context_line":"            LOG.warning(\u0027Unfamiliar update: %s\u0027, str(update))"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def iter_model_references_deep(self, obj):"},{"line_number":336,"context_line":"        seen \u003d set()"},{"line_number":337,"context_line":"        queue \u003d collections.deque((obj,))"},{"line_number":338,"context_line":"        while queue:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f96bb07_3a62fc17","line":335,"in_reply_to":"7f96bb07_19b71589","updated":"2018-01-22 14:34:04.000000000","message":"It requires nb_api, which is not available in model_framework (it would cause a cyclic dependency)","commit_id":"2d818280b7e191892dfaf36465b9fff1e1902261"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"181324fa50031f9e4c5790ec7b1615f9eb2899da","unresolved":false,"context_lines":[{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def _send_pending_events(self, obj):"},{"line_number":348,"context_line":"        try:"},{"line_number":349,"context_line":"            pending \u003d self._waiting.remove(obj.id)"},{"line_number":350,"context_line":"        except KeyError:"},{"line_number":351,"context_line":"            return  # Nothing to do"},{"line_number":352,"context_line":"        for item in pending:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7f96bb07_357ddfb1","line":349,"updated":"2018-01-24 13:39:29.000000000","message":"del self._waiting[obj.id]? \n\n(from the log : \n_send_pending_events\nJan 23 14:39:26.236945 ubuntu-xenial-ovh-bhs1-0002082374 df-local-controller[889]: ERROR dragonflow.controller.df_local_controller     pending \u003d self._waiting.remove(obj.id)\nJan 23 14:39:26.237214 ubuntu-xenial-ovh-bhs1-0002082374 df-local-controller[889]: ERROR dragonflow.controller.df_local_controller AttributeError: \u0027collections.defaultdict\u0027 object has no attribute \u0027remove\u0027 )","commit_id":"94ddc9021d69597937c2e7a82bb3ecddece3a17a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"b6c442363caf192008088c0abba156b7e809fcc6","unresolved":false,"context_lines":[{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def _send_pending_events(self, obj):"},{"line_number":348,"context_line":"        try:"},{"line_number":349,"context_line":"            pending \u003d self._waiting.remove(obj.id)"},{"line_number":350,"context_line":"        except KeyError:"},{"line_number":351,"context_line":"            return  # Nothing to do"},{"line_number":352,"context_line":"        for item in pending:"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f93b717_76be3b66","line":349,"in_reply_to":"7f96bb07_357ddfb1","updated":"2018-01-28 08:28:15.000000000","message":"Yes. But will use pop since I want the removed value.","commit_id":"94ddc9021d69597937c2e7a82bb3ecddece3a17a"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"181324fa50031f9e4c5790ec7b1615f9eb2899da","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        for item in pending:"},{"line_number":353,"context_line":"            self._send_updates_for_object(item)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def iter_model_references_deep(self, obj):"},{"line_number":356,"context_line":"        seen \u003d set()"},{"line_number":357,"context_line":"        queue \u003d collections.deque((obj,))"},{"line_number":358,"context_line":"        while queue:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7f96bb07_f54c579f","line":355,"updated":"2018-01-24 13:39:29.000000000","message":"maybe move to model framework ?","commit_id":"94ddc9021d69597937c2e7a82bb3ecddece3a17a"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"b6c442363caf192008088c0abba156b7e809fcc6","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        for item in pending:"},{"line_number":353,"context_line":"            self._send_updates_for_object(item)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def iter_model_references_deep(self, obj):"},{"line_number":356,"context_line":"        seen \u003d set()"},{"line_number":357,"context_line":"        queue \u003d collections.deque((obj,))"},{"line_number":358,"context_line":"        while queue:"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f93b717_f6880bc7","line":355,"in_reply_to":"7f96bb07_f54c579f","updated":"2018-01-28 08:28:15.000000000","message":"It requires nb_api, which is not available in model_framework (it would cause a cyclic dependency)","commit_id":"94ddc9021d69597937c2e7a82bb3ecddece3a17a"},{"author":{"_account_id":23235,"name":"Lihi Wishnitzer","email":"lihiwish@gmail.com","username":"lihiwish"},"change_message_id":"f907350a64caf8be1cd15149c1c9117aaf962321","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def __init__(self, chassis_name, nb_api):"},{"line_number":53,"context_line":"        self.db_store \u003d db_store.get_instance()"},{"line_number":54,"context_line":"        self._waiting \u003d collections.defaultdict(set)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        self.chassis_name \u003d chassis_name"},{"line_number":57,"context_line":"        self.nb_api \u003d nb_api"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_d6238104","line":54,"range":{"start_line":54,"start_character":13,"end_line":54,"end_character":21},"updated":"2018-01-29 09:10:25.000000000","message":"I think another name will help making this easier to understand.\n\nAlso, it this is used only in 2 functions, why not passing it between them instead of using the controller to store it?","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"58a0f687538dbe82f2fe0c0c432e748bcf668c19","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def __init__(self, chassis_name, nb_api):"},{"line_number":53,"context_line":"        self.db_store \u003d db_store.get_instance()"},{"line_number":54,"context_line":"        self._waiting \u003d collections.defaultdict(set)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        self.chassis_name \u003d chassis_name"},{"line_number":57,"context_line":"        self.nb_api \u003d nb_api"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_4cd7de24","line":54,"range":{"start_line":54,"start_character":13,"end_line":54,"end_character":21},"in_reply_to":"5f93b717_d6238104","updated":"2018-01-29 10:16:43.000000000","message":"Let me try and think of something. A suggestion would help :)","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":23235,"name":"Lihi Wishnitzer","email":"lihiwish@gmail.com","username":"lihiwish"},"change_message_id":"f907350a64caf8be1cd15149c1c9117aaf962321","unresolved":false,"context_lines":[{"line_number":340,"context_line":"    def _send_updates_for_object(self, obj):"},{"line_number":341,"context_line":"        try:"},{"line_number":342,"context_line":"            references \u003d tuple(self.iter_model_references_deep(obj))"},{"line_number":343,"context_line":"        except exceptions.ReferencedObjectNotFound as e:"},{"line_number":344,"context_line":"            proxy \u003d e.kwargs[\u0027proxy\u0027]"},{"line_number":345,"context_line":"            reference_id \u003d proxy.id"},{"line_number":346,"context_line":"            model \u003d self._get_model(obj)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_76db8d1a","line":343,"range":{"start_line":343,"start_character":26,"end_line":343,"end_character":50},"updated":"2018-01-29 09:10:25.000000000","message":"Why would this happen?","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"58a0f687538dbe82f2fe0c0c432e748bcf668c19","unresolved":false,"context_lines":[{"line_number":340,"context_line":"    def _send_updates_for_object(self, obj):"},{"line_number":341,"context_line":"        try:"},{"line_number":342,"context_line":"            references \u003d tuple(self.iter_model_references_deep(obj))"},{"line_number":343,"context_line":"        except exceptions.ReferencedObjectNotFound as e:"},{"line_number":344,"context_line":"            proxy \u003d e.kwargs[\u0027proxy\u0027]"},{"line_number":345,"context_line":"            reference_id \u003d proxy.id"},{"line_number":346,"context_line":"            model \u003d self._get_model(obj)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_8c69668c","line":343,"range":{"start_line":343,"start_character":26,"end_line":343,"end_character":50},"in_reply_to":"5f93b717_76db8d1a","updated":"2018-01-29 10:16:43.000000000","message":"iter_model_references_deep has to dereference all referenced objects (that\u0027s what makes it deep). If it can\u0027t do that, it somehow has to propagate that up to the caller (somehow say \u0027this is incomplete since X is missing\u0027). I don\u0027t think this is something iter_model_references_deep knows how to deal with by itself.\n\nWill add docstring.","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"20e0b5f17c74ef3b2fc3680e03cfe7771dee1205","unresolved":false,"context_lines":[{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    def _send_pending_events(self, obj):"},{"line_number":354,"context_line":"        try:"},{"line_number":355,"context_line":"            pending \u003d self._waiting.pop(obj.id)"},{"line_number":356,"context_line":"        except KeyError:"},{"line_number":357,"context_line":"            return  # Nothing to do"},{"line_number":358,"context_line":"        for model, item_id in pending:"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_31de6f11","line":355,"range":{"start_line":355,"start_character":27,"end_line":355,"end_character":35},"updated":"2018-01-29 09:41:11.000000000","message":"So, if I have a port that is referencing a subnet that we do not know, which in turn, references a network that we do not know, we will add the port to the waiting list, resting on the subnet id. Then, only when we will have an update for the subnet, we will pop the port from the list and add it re added resting on the network id, and finally process it only when we will have an update for the network?","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"58a0f687538dbe82f2fe0c0c432e748bcf668c19","unresolved":false,"context_lines":[{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    def _send_pending_events(self, obj):"},{"line_number":354,"context_line":"        try:"},{"line_number":355,"context_line":"            pending \u003d self._waiting.pop(obj.id)"},{"line_number":356,"context_line":"        except KeyError:"},{"line_number":357,"context_line":"            return  # Nothing to do"},{"line_number":358,"context_line":"        for model, item_id in pending:"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_6c1c1a12","line":355,"range":{"start_line":355,"start_character":27,"end_line":355,"end_character":35},"in_reply_to":"5f93b717_31de6f11","updated":"2018-01-29 10:16:43.000000000","message":"Yes and no. We first check that all of subnet\u0027s dependencies exist before yanking it\u0027s dependents.\n\nSee _send_updates_for_object, where the _send_*_events is called only when all dependencies are met.","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"43583014e389e09798ca9e7e07057222902b25b7","unresolved":false,"context_lines":[{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    def _send_pending_events(self, obj):"},{"line_number":354,"context_line":"        try:"},{"line_number":355,"context_line":"            pending \u003d self._waiting.pop(obj.id)"},{"line_number":356,"context_line":"        except KeyError:"},{"line_number":357,"context_line":"            return  # Nothing to do"},{"line_number":358,"context_line":"        for model, item_id in pending:"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_87d06021","line":355,"range":{"start_line":355,"start_character":27,"end_line":355,"end_character":35},"in_reply_to":"5f93b717_6c1c1a12","updated":"2018-01-29 12:19:34.000000000","message":"My point is that only when we will get updates for both the subnet and network, the port will be available?","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"3e712f517f8e0a3180def6e68b14193225972cda","unresolved":false,"context_lines":[{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    def _send_pending_events(self, obj):"},{"line_number":354,"context_line":"        try:"},{"line_number":355,"context_line":"            pending \u003d self._waiting.pop(obj.id)"},{"line_number":356,"context_line":"        except KeyError:"},{"line_number":357,"context_line":"            return  # Nothing to do"},{"line_number":358,"context_line":"        for model, item_id in pending:"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_c22ac02a","line":355,"range":{"start_line":355,"start_character":27,"end_line":355,"end_character":35},"in_reply_to":"5f93b717_87d06021","updated":"2018-01-30 08:00:56.000000000","message":"Yes.","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"f000d69736bd178a70a83570ab59f0d5c6e50524","unresolved":false,"context_lines":[{"line_number":377,"context_line":"    def _dereference(self, reference):"},{"line_number":378,"context_line":"        item \u003d reference.get_object()"},{"line_number":379,"context_line":"        if item is None:"},{"line_number":380,"context_line":"            item \u003d self.nb_api.get(reference)"},{"line_number":381,"context_line":"        if item is None:"},{"line_number":382,"context_line":"            raise exceptions.ReferencedObjectNotFound(proxy\u003dreference)"},{"line_number":383,"context_line":"        return item"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_51d77b24","line":380,"updated":"2018-01-29 09:29:34.000000000","message":"Following the discussion on PS-10 , may you you can use the get-attribute and use the object will resolved by the model proxy ?(and then move that to model-framework?  )","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"58a0f687538dbe82f2fe0c0c432e748bcf668c19","unresolved":false,"context_lines":[{"line_number":377,"context_line":"    def _dereference(self, reference):"},{"line_number":378,"context_line":"        item \u003d reference.get_object()"},{"line_number":379,"context_line":"        if item is None:"},{"line_number":380,"context_line":"            item \u003d self.nb_api.get(reference)"},{"line_number":381,"context_line":"        if item is None:"},{"line_number":382,"context_line":"            raise exceptions.ReferencedObjectNotFound(proxy\u003dreference)"},{"line_number":383,"context_line":"        return item"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_8cec06f4","line":380,"in_reply_to":"5f93b717_51d77b24","updated":"2018-01-29 10:16:43.000000000","message":"I don\u0027t think I understand?","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"98f55fc09bc5bc0f9a8f970339b69a3282834f6a","unresolved":false,"context_lines":[{"line_number":377,"context_line":"    def _dereference(self, reference):"},{"line_number":378,"context_line":"        item \u003d reference.get_object()"},{"line_number":379,"context_line":"        if item is None:"},{"line_number":380,"context_line":"            item \u003d self.nb_api.get(reference)"},{"line_number":381,"context_line":"        if item is None:"},{"line_number":382,"context_line":"            raise exceptions.ReferencedObjectNotFound(proxy\u003dreference)"},{"line_number":383,"context_line":"        return item"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_074e906e","line":380,"in_reply_to":"5f93b717_8cec06f4","updated":"2018-01-29 11:48:53.000000000","message":"Never mind i confused.","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"82cfb1eeb42387e55b0cf123e2fba7b2d6861bbc","unresolved":false,"context_lines":[{"line_number":385,"context_line":"                continue"},{"line_number":386,"context_line":"            seen.add(item.id)"},{"line_number":387,"context_line":"            if model_proxy.is_model_proxy(item):"},{"line_number":388,"context_line":"                item \u003d self._dereference(item)"},{"line_number":389,"context_line":"                yield item"},{"line_number":390,"context_line":"            for submodel in item.iter_submodels():"},{"line_number":391,"context_line":"                queue.append(submodel)"}],"source_content_type":"text/x-python","patch_set":13,"id":"df7087c5_3878d3f6","line":388,"range":{"start_line":388,"start_character":16,"end_line":388,"end_character":46},"updated":"2018-03-20 08:05:37.000000000","message":"If an exception is thrown here for a non-first-level item, then we may lose some of the updates, as we will only add the problematic item in line 346.","commit_id":"2980284eaaa868d9a1e61d6907631640c172fd67"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"8d3602830c7e5a0a051f2187ae6e9fd99fa6f51a","unresolved":false,"context_lines":[{"line_number":385,"context_line":"                continue"},{"line_number":386,"context_line":"            seen.add(item.id)"},{"line_number":387,"context_line":"            if model_proxy.is_model_proxy(item):"},{"line_number":388,"context_line":"                item \u003d self._dereference(item)"},{"line_number":389,"context_line":"                yield item"},{"line_number":390,"context_line":"            for submodel in item.iter_submodels():"},{"line_number":391,"context_line":"                queue.append(submodel)"}],"source_content_type":"text/x-python","patch_set":13,"id":"bf659307_fa04a5c8","line":388,"range":{"start_line":388,"start_character":16,"end_line":388,"end_character":46},"in_reply_to":"df7087c5_3878d3f6","updated":"2018-03-26 05:42:04.000000000","message":"The caller first scans the entire iterator for errors, and only acts if all the references exist.\n\nI will make this function private, and add a wrapper function to promote the \u0027correct\u0027 caller behaviour.","commit_id":"2980284eaaa868d9a1e61d6907631640c172fd67"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"6d2ed73891f6929977f8037d06b3e640fb962753","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def __init__(self, chassis_name, nb_api):"},{"line_number":53,"context_line":"        self.db_store \u003d db_store.get_instance()"},{"line_number":54,"context_line":"        # pending_id -\u003e (model, pender_id) A map of objects (model, pender)"},{"line_number":55,"context_line":"        #               pending the arrival of pending"},{"line_number":56,"context_line":"        self._pending_objects \u003d collections.defaultdict(set)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        self.chassis_name \u003d chassis_name"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_1a29eb88","line":55,"range":{"start_line":54,"start_character":6,"end_line":55,"end_character":54},"updated":"2018-04-11 10:36:35.000000000","message":"please rephrase","commit_id":"15edeea94094235e1ad6e96672739a7600535e00"},{"author":{"_account_id":23235,"name":"Lihi Wishnitzer","email":"lihiwish@gmail.com","username":"lihiwish"},"change_message_id":"26c19c081238460adc2e37f351aa882c11d7305d","unresolved":false,"context_lines":[{"line_number":407,"context_line":"                continue"},{"line_number":408,"context_line":"            seen.add(item.id)"},{"line_number":409,"context_line":"            if model_proxy.is_model_proxy(item):"},{"line_number":410,"context_line":"                item \u003d self._dereference(item)"},{"line_number":411,"context_line":"                yield item"},{"line_number":412,"context_line":"            for submodel in item.iter_submodels():"},{"line_number":413,"context_line":"                queue.append(submodel)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f6a8fd7_19009e34","line":410,"range":{"start_line":410,"start_character":28,"end_line":410,"end_character":40},"updated":"2018-04-16 08:27:56.000000000","message":"It may be more understood adding here a comment, mantioning that the exception is raised actually from _dereference","commit_id":"ed212968447554e7edf895d025abba359dbbe246"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"eeba621ce2917799c6c028bb30d079ba81a64811","unresolved":false,"context_lines":[{"line_number":407,"context_line":"                continue"},{"line_number":408,"context_line":"            seen.add(item.id)"},{"line_number":409,"context_line":"            if model_proxy.is_model_proxy(item):"},{"line_number":410,"context_line":"                item \u003d self._dereference(item)"},{"line_number":411,"context_line":"                yield item"},{"line_number":412,"context_line":"            for submodel in item.iter_submodels():"},{"line_number":413,"context_line":"                queue.append(submodel)"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_c8bf3f5f","line":410,"range":{"start_line":410,"start_character":28,"end_line":410,"end_character":40},"in_reply_to":"9f6a8fd7_19009e34","updated":"2018-05-10 06:56:27.000000000","message":"Done","commit_id":"ed212968447554e7edf895d025abba359dbbe246"}],"dragonflow/db/model_framework.py":[{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"b9b7ce50a5185816890df979ff23d05573ddec26","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            except AttributeError:"},{"line_number":281,"context_line":"                pass  # Not a reference"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def iter_references_deep(self, nb_api):"},{"line_number":284,"context_line":"        seen \u003d set()"},{"line_number":285,"context_line":"        queue \u003d collections.deque((self,))"},{"line_number":286,"context_line":"        while len(queue) \u003e 0:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_f5d9c756","line":283,"range":{"start_line":283,"start_character":35,"end_line":283,"end_character":41},"updated":"2017-07-04 17:40:48.000000000","message":"I think this logic is better suited to df_local_controller. I feel more comfortable with the controller performing NB API operations rather than the model object.","commit_id":"b5ba883c0c643857e23a19d74b04999fb02f2273"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"a6f2ea441b9bdd4d745d84b303c0fb9fe9dec9ab","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            except AttributeError:"},{"line_number":281,"context_line":"                pass  # Not a reference"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def iter_references_deep(self, nb_api):"},{"line_number":284,"context_line":"        seen \u003d set()"},{"line_number":285,"context_line":"        queue \u003d collections.deque((self,))"},{"line_number":286,"context_line":"        while len(queue) \u003e 0:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f436f4f_3c3ebcc0","line":283,"range":{"start_line":283,"start_character":35,"end_line":283,"end_character":41},"in_reply_to":"3f1d235d_f5d9c756","updated":"2018-01-22 14:34:04.000000000","message":"Done","commit_id":"b5ba883c0c643857e23a19d74b04999fb02f2273"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"b9b7ce50a5185816890df979ff23d05573ddec26","unresolved":false,"context_lines":[{"line_number":281,"context_line":"                pass  # Not a reference"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def iter_references_deep(self, nb_api):"},{"line_number":284,"context_line":"        seen \u003d set()"},{"line_number":285,"context_line":"        queue \u003d collections.deque((self,))"},{"line_number":286,"context_line":"        while len(queue) \u003e 0:"},{"line_number":287,"context_line":"            item \u003d queue.pop()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_d5b36b09","line":284,"range":{"start_line":284,"start_character":8,"end_line":284,"end_character":12},"updated":"2017-07-04 17:40:48.000000000","message":"Do we have a case of circular references? The model dependency graph is a DAG as ensured by the code below. Do we have models that reference other instances of themselves?","commit_id":"b5ba883c0c643857e23a19d74b04999fb02f2273"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"a6f2ea441b9bdd4d745d84b303c0fb9fe9dec9ab","unresolved":false,"context_lines":[{"line_number":281,"context_line":"                pass  # Not a reference"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def iter_references_deep(self, nb_api):"},{"line_number":284,"context_line":"        seen \u003d set()"},{"line_number":285,"context_line":"        queue \u003d collections.deque((self,))"},{"line_number":286,"context_line":"        while len(queue) \u003e 0:"},{"line_number":287,"context_line":"            item \u003d queue.pop()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f436f4f_fc3394f4","line":284,"range":{"start_line":284,"start_character":8,"end_line":284,"end_character":12},"in_reply_to":"3f1d235d_d5b36b09","updated":"2018-01-22 14:34:04.000000000","message":"Shouldn\u0027t happen, but it\u0027s a simple, clear sanity.","commit_id":"b5ba883c0c643857e23a19d74b04999fb02f2273"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"b9b7ce50a5185816890df979ff23d05573ddec26","unresolved":false,"context_lines":[{"line_number":283,"context_line":"    def iter_references_deep(self, nb_api):"},{"line_number":284,"context_line":"        seen \u003d set()"},{"line_number":285,"context_line":"        queue \u003d collections.deque((self,))"},{"line_number":286,"context_line":"        while len(queue) \u003e 0:"},{"line_number":287,"context_line":"            item \u003d queue.pop()"},{"line_number":288,"context_line":"            do_yield \u003d False"},{"line_number":289,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_d5da4b49","line":286,"range":{"start_line":286,"start_character":13,"end_line":286,"end_character":29},"updated":"2017-07-04 17:40:48.000000000","message":"nit: while queue:","commit_id":"b5ba883c0c643857e23a19d74b04999fb02f2273"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"a6f2ea441b9bdd4d745d84b303c0fb9fe9dec9ab","unresolved":false,"context_lines":[{"line_number":283,"context_line":"    def iter_references_deep(self, nb_api):"},{"line_number":284,"context_line":"        seen \u003d set()"},{"line_number":285,"context_line":"        queue \u003d collections.deque((self,))"},{"line_number":286,"context_line":"        while len(queue) \u003e 0:"},{"line_number":287,"context_line":"            item \u003d queue.pop()"},{"line_number":288,"context_line":"            do_yield \u003d False"},{"line_number":289,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f436f4f_dc2e908a","line":286,"range":{"start_line":286,"start_character":13,"end_line":286,"end_character":29},"in_reply_to":"3f1d235d_d5da4b49","updated":"2018-01-22 14:34:04.000000000","message":"Done","commit_id":"b5ba883c0c643857e23a19d74b04999fb02f2273"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"b9b7ce50a5185816890df979ff23d05573ddec26","unresolved":false,"context_lines":[{"line_number":292,"context_line":"                item \u003d dereffed"},{"line_number":293,"context_line":"            except AttributeError:"},{"line_number":294,"context_line":"                do_yield \u003d False  # Not a reference"},{"line_number":295,"context_line":"            if item.id in seen:"},{"line_number":296,"context_line":"                continue"},{"line_number":297,"context_line":"            seen.add(item.id)"},{"line_number":298,"context_line":"            if do_yield:"},{"line_number":299,"context_line":"                yield item"},{"line_number":300,"context_line":"            for submodel in item.iter_submodels():"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_b5ad8f9c","line":297,"range":{"start_line":295,"start_character":12,"end_line":297,"end_character":29},"updated":"2017-07-04 17:40:48.000000000","message":"Can be moved up right after pop, since IDs are available on refs without fetching.\n\nThis helps eliminating do_yield.","commit_id":"b5ba883c0c643857e23a19d74b04999fb02f2273"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"a6f2ea441b9bdd4d745d84b303c0fb9fe9dec9ab","unresolved":false,"context_lines":[{"line_number":292,"context_line":"                item \u003d dereffed"},{"line_number":293,"context_line":"            except AttributeError:"},{"line_number":294,"context_line":"                do_yield \u003d False  # Not a reference"},{"line_number":295,"context_line":"            if item.id in seen:"},{"line_number":296,"context_line":"                continue"},{"line_number":297,"context_line":"            seen.add(item.id)"},{"line_number":298,"context_line":"            if do_yield:"},{"line_number":299,"context_line":"                yield item"},{"line_number":300,"context_line":"            for submodel in item.iter_submodels():"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f436f4f_bc4f4c69","line":297,"range":{"start_line":295,"start_character":12,"end_line":297,"end_character":29},"in_reply_to":"3f1d235d_b5ad8f9c","updated":"2018-01-22 14:34:04.000000000","message":"Done","commit_id":"b5ba883c0c643857e23a19d74b04999fb02f2273"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"dd8cd104e80bb99aed72dc08e2d8787d2ffb2e01","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def is_submodel(instance):"},{"line_number":43,"context_line":"    return (isinstance(instance, ModelBase) or"},{"line_number":44,"context_line":"            hasattr(instance, \u0027get_object\u0027))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class _CommonBase(models.Base):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f436f4f_a2fc5eb5","line":44,"range":{"start_line":44,"start_character":13,"end_line":44,"end_character":42},"updated":"2017-08-21 14:15:08.000000000","message":"This is for identifying model proxies? importing model_proxy and using isinstance creates a cycle?","commit_id":"b1c3b96b5cea011efa32a75fac1e9f67a8278016"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"a6f2ea441b9bdd4d745d84b303c0fb9fe9dec9ab","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def is_submodel(instance):"},{"line_number":43,"context_line":"    return (isinstance(instance, ModelBase) or"},{"line_number":44,"context_line":"            hasattr(instance, \u0027get_object\u0027))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class _CommonBase(models.Base):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f436f4f_52a1eea8","line":44,"range":{"start_line":44,"start_character":13,"end_line":44,"end_character":42},"in_reply_to":"9f436f4f_a2fc5eb5","updated":"2018-01-22 14:34:04.000000000","message":"Yes.","commit_id":"b1c3b96b5cea011efa32a75fac1e9f67a8278016"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"a6f2ea441b9bdd4d745d84b303c0fb9fe9dec9ab","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        for submodel in self.iter_submodels():"},{"line_number":278,"context_line":"            try:"},{"line_number":279,"context_line":"                yield submodel"},{"line_number":280,"context_line":"            except AttributeError:"},{"line_number":281,"context_line":"                pass  # Not a reference"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f436f4f_f2ad829b","line":280,"range":{"start_line":280,"start_character":0,"end_line":280,"end_character":34},"updated":"2018-01-22 14:34:04.000000000","message":"This try except isn\u0027t needed anymore.","commit_id":"b1c3b96b5cea011efa32a75fac1e9f67a8278016"},{"author":{"_account_id":23235,"name":"Lihi Wishnitzer","email":"lihiwish@gmail.com","username":"lihiwish"},"change_message_id":"f907350a64caf8be1cd15149c1c9117aaf962321","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                if isinstance(subobj, ModelBase):"},{"line_number":274,"context_line":"                    yield subobj"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def iter_submodels(self):"},{"line_number":277,"context_line":"        for name, field in self:"},{"line_number":278,"context_line":"            member \u003d getattr(self, name)"},{"line_number":279,"context_line":"            if isinstance(member, list):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_1671e9e0","line":276,"updated":"2018-01-29 09:10:25.000000000","message":"Why does iter_submodels does not handles AttributeError exceptions on its own ? (as it will always happen when using iter_submodels).\nThis will also make iter_reference unnecessary.","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"58a0f687538dbe82f2fe0c0c432e748bcf668c19","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                if isinstance(subobj, ModelBase):"},{"line_number":274,"context_line":"                    yield subobj"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def iter_submodels(self):"},{"line_number":277,"context_line":"        for name, field in self:"},{"line_number":278,"context_line":"            member \u003d getattr(self, name)"},{"line_number":279,"context_line":"            if isinstance(member, list):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_cccbee6f","line":276,"in_reply_to":"5f93b717_1671e9e0","updated":"2018-01-29 10:16:43.000000000","message":"This code is very strange. Luckily, it appears unused. I\u0027ll remove it.","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"3e712f517f8e0a3180def6e68b14193225972cda","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                if isinstance(subobj, ModelBase):"},{"line_number":274,"context_line":"                    yield subobj"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def iter_submodels(self):"},{"line_number":277,"context_line":"        for name, field in self:"},{"line_number":278,"context_line":"            member \u003d getattr(self, name)"},{"line_number":279,"context_line":"            if isinstance(member, list):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_e22fbc3c","line":276,"in_reply_to":"5f93b717_cccbee6f","updated":"2018-01-30 08:00:56.000000000","message":"No, I got this wrong. It is used.\n\niter_references is unused and removed.\n\nChanged iterator to iter_over_set_fields, to make sure the getattr doesn\u0027t fail.","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"20e0b5f17c74ef3b2fc3680e03cfe7771dee1205","unresolved":false,"context_lines":[{"line_number":283,"context_line":"            elif is_submodel(member):"},{"line_number":284,"context_line":"                yield member"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def iter_references(self):"},{"line_number":287,"context_line":"        for submodel in self.iter_submodels():"},{"line_number":288,"context_line":"            try:"},{"line_number":289,"context_line":"                yield submodel"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_b156ff5b","line":286,"range":{"start_line":286,"start_character":8,"end_line":286,"end_character":23},"updated":"2018-01-29 09:41:11.000000000","message":"where is this used?","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"58a0f687538dbe82f2fe0c0c432e748bcf668c19","unresolved":false,"context_lines":[{"line_number":283,"context_line":"            elif is_submodel(member):"},{"line_number":284,"context_line":"                yield member"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def iter_references(self):"},{"line_number":287,"context_line":"        for submodel in self.iter_submodels():"},{"line_number":288,"context_line":"            try:"},{"line_number":289,"context_line":"                yield submodel"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_4cc03e51","line":286,"range":{"start_line":286,"start_character":8,"end_line":286,"end_character":23},"in_reply_to":"5f93b717_b156ff5b","updated":"2018-01-29 10:16:43.000000000","message":"Appears unused. Will remove.","commit_id":"cc975ccaa016b9d458dd9121277d4e4cc5d5ee3f"}],"dragonflow/ovsdb/vswitch_impl.py":[{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"1e0f419d61477294a600f814d3717dfb08414e2b","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        if iface and netaddr.valid_mac(iface[\u0027mac_in_use\u0027]):"},{"line_number":158,"context_line":"            return iface[\u0027mac_in_use\u0027]"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def get_port_id_by_ofport(self, ofport):"},{"line_number":161,"context_line":"        columns \u003d {\u0027ofport\u0027, \u0027external_ids\u0027}"},{"line_number":162,"context_line":"        ifaces \u003d self.ovsdb.db_find(\u0027Interface\u0027, (\u0027ofport\u0027, \u0027\u003d\u0027, str(ofport)),"},{"line_number":163,"context_line":"                                    columns\u003dcolumns).execute()"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f96bb07_59303d08","line":160,"updated":"2018-01-22 11:00:10.000000000","message":"Why that related to the commit ? \nI am not mange to find where it\u0027s been used","commit_id":"2d818280b7e191892dfaf36465b9fff1e1902261"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"a6f2ea441b9bdd4d745d84b303c0fb9fe9dec9ab","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        if iface and netaddr.valid_mac(iface[\u0027mac_in_use\u0027]):"},{"line_number":158,"context_line":"            return iface[\u0027mac_in_use\u0027]"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def get_port_id_by_ofport(self, ofport):"},{"line_number":161,"context_line":"        columns \u003d {\u0027ofport\u0027, \u0027external_ids\u0027}"},{"line_number":162,"context_line":"        ifaces \u003d self.ovsdb.db_find(\u0027Interface\u0027, (\u0027ofport\u0027, \u0027\u003d\u0027, str(ofport)),"},{"line_number":163,"context_line":"                                    columns\u003dcolumns).execute()"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f96bb07_5a502833","line":160,"in_reply_to":"7f96bb07_59303d08","updated":"2018-01-22 14:34:04.000000000","message":"Huh... Guess I\u0027ll have to remove it :)","commit_id":"2d818280b7e191892dfaf36465b9fff1e1902261"}],"dragonflow/tests/unit/test_df_local_controller.py":[{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"dd8cd104e80bb99aed72dc08e2d8787d2ffb2e01","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        @model_framework.construct_nb_db_model"},{"line_number":173,"context_line":"        class LocalReffedModel(model_framework.ModelBase):"},{"line_number":174,"context_line":"            table_name \u003d \u0027LocalReffedModel\u0027"},{"line_number":175,"context_line":"            pass"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        @model_framework.register_model"},{"line_number":178,"context_line":"        @model_framework.construct_nb_db_model"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f436f4f_c2ef62e7","line":175,"range":{"start_line":175,"start_character":12,"end_line":175,"end_character":16},"updated":"2017-08-21 14:15:08.000000000","message":"redundant","commit_id":"b1c3b96b5cea011efa32a75fac1e9f67a8278016"},{"author":{"_account_id":23235,"name":"Lihi Wishnitzer","email":"lihiwish@gmail.com","username":"lihiwish"},"change_message_id":"26c19c081238460adc2e37f351aa882c11d7305d","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        nb_api.get \u003d lambda m: models[m.id]"},{"line_number":194,"context_line":"        ref1 \u003d LocalReffingModel(id\u003d\u00272\u0027, ref1\u003d\u00273\u0027)"},{"line_number":195,"context_line":"        models[\u00272\u0027] \u003d ref1"},{"line_number":196,"context_line":"        models[\u00273\u0027] \u003d LocalReffedModel(id\u003d\u00273\u0027)"},{"line_number":197,"context_line":"        ref2 \u003d LocalReffingModel(id\u003d\u00274\u0027, ref1\u003d\u00275\u0027)"},{"line_number":198,"context_line":"        models[\u00274\u0027] \u003d ref2"},{"line_number":199,"context_line":"        models[\u00275\u0027] \u003d LocalReffedModel(id\u003d\u00275\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f6a8fd7_14406535","line":196,"updated":"2018-04-16 08:27:56.000000000","message":"Why not to define the reffed model prior to defining the reffing model?","commit_id":"ed212968447554e7edf895d025abba359dbbe246"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"9de9cc12f818480aa107a1bc4c66ffd554682794","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        nb_api.get \u003d lambda m: models[m.id]"},{"line_number":194,"context_line":"        ref1 \u003d LocalReffingModel(id\u003d\u00272\u0027, ref1\u003d\u00273\u0027)"},{"line_number":195,"context_line":"        models[\u00272\u0027] \u003d ref1"},{"line_number":196,"context_line":"        models[\u00273\u0027] \u003d LocalReffedModel(id\u003d\u00273\u0027)"},{"line_number":197,"context_line":"        ref2 \u003d LocalReffingModel(id\u003d\u00274\u0027, ref1\u003d\u00275\u0027)"},{"line_number":198,"context_line":"        models[\u00274\u0027] \u003d ref2"},{"line_number":199,"context_line":"        models[\u00275\u0027] \u003d LocalReffedModel(id\u003d\u00275\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f6a8fd7_20821002","line":196,"in_reply_to":"9f6a8fd7_14406535","updated":"2018-04-26 12:43:05.000000000","message":"Totally agree","commit_id":"ed212968447554e7edf895d025abba359dbbe246"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"eeba621ce2917799c6c028bb30d079ba81a64811","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        nb_api.get \u003d lambda m: models[m.id]"},{"line_number":194,"context_line":"        ref1 \u003d LocalReffingModel(id\u003d\u00272\u0027, ref1\u003d\u00273\u0027)"},{"line_number":195,"context_line":"        models[\u00272\u0027] \u003d ref1"},{"line_number":196,"context_line":"        models[\u00273\u0027] \u003d LocalReffedModel(id\u003d\u00273\u0027)"},{"line_number":197,"context_line":"        ref2 \u003d LocalReffingModel(id\u003d\u00274\u0027, ref1\u003d\u00275\u0027)"},{"line_number":198,"context_line":"        models[\u00274\u0027] \u003d ref2"},{"line_number":199,"context_line":"        models[\u00275\u0027] \u003d LocalReffedModel(id\u003d\u00275\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_e8c47bf7","line":196,"in_reply_to":"9f6a8fd7_20821002","updated":"2018-05-10 06:56:27.000000000","message":"Sure.\n\nNote the IDs aren\u0027t changed. They represent the expected order.","commit_id":"ed212968447554e7edf895d025abba359dbbe246"},{"author":{"_account_id":23235,"name":"Lihi Wishnitzer","email":"lihiwish@gmail.com","username":"lihiwish"},"change_message_id":"26c19c081238460adc2e37f351aa882c11d7305d","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        ref1 \u003d LocalReffingModel(id\u003d\u00272\u0027, ref1\u003d\u00273\u0027)"},{"line_number":195,"context_line":"        models[\u00272\u0027] \u003d ref1"},{"line_number":196,"context_line":"        models[\u00273\u0027] \u003d LocalReffedModel(id\u003d\u00273\u0027)"},{"line_number":197,"context_line":"        ref2 \u003d LocalReffingModel(id\u003d\u00274\u0027, ref1\u003d\u00275\u0027)"},{"line_number":198,"context_line":"        models[\u00274\u0027] \u003d ref2"},{"line_number":199,"context_line":"        models[\u00275\u0027] \u003d LocalReffedModel(id\u003d\u00275\u0027)"},{"line_number":200,"context_line":"        model \u003d LocalListReffingModel(id\u003d\u00271\u0027, ref2\u003d[ref1, ref2])"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f6a8fd7_9475559b","line":197,"updated":"2018-04-16 08:27:56.000000000","message":"Same here","commit_id":"ed212968447554e7edf895d025abba359dbbe246"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"eeba621ce2917799c6c028bb30d079ba81a64811","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        ref1 \u003d LocalReffingModel(id\u003d\u00272\u0027, ref1\u003d\u00273\u0027)"},{"line_number":195,"context_line":"        models[\u00272\u0027] \u003d ref1"},{"line_number":196,"context_line":"        models[\u00273\u0027] \u003d LocalReffedModel(id\u003d\u00273\u0027)"},{"line_number":197,"context_line":"        ref2 \u003d LocalReffingModel(id\u003d\u00274\u0027, ref1\u003d\u00275\u0027)"},{"line_number":198,"context_line":"        models[\u00274\u0027] \u003d ref2"},{"line_number":199,"context_line":"        models[\u00275\u0027] \u003d LocalReffedModel(id\u003d\u00275\u0027)"},{"line_number":200,"context_line":"        model \u003d LocalListReffingModel(id\u003d\u00271\u0027, ref2\u003d[ref1, ref2])"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_88b5c780","line":197,"in_reply_to":"9f6a8fd7_9475559b","updated":"2018-05-10 06:56:27.000000000","message":"Sure.","commit_id":"ed212968447554e7edf895d025abba359dbbe246"}]}
